Flush Separate Castle ActiveRecord Transaction And Refresh Object In Another Transaction
Jun 15, 2010
I've got all of my ASP.NET requests wrapped in a Session and a Transaction that gets commited only at the very end of the request. At some point during execution of the request, I would like to insert an object and make it visible to other potential threads - i.e. split the insertion into a new transaction, commit that transaction, and move on. The reason is that the request in question hits an API that then chain hits another one of my pages (near-synchronously) to let me know that it processed, and thus double submits a transaction record, because the original request had not yet finished, and thus not committed the transaction record.
So I've tried wrapping the insertion code with a new SessionScope, TransactionScope(TransactionMode.New), combination of both, flushing everything manually, etc. However, when I call Refresh on the object I'm still getting the old object state. Here's some code sample for what I'm seeing:
Post outsidePost = Post.Find(id); // status of this post is Status.Old
using (TransactionScope transaction = new TransactionScope(TransactionMode.New))
{
Post p = Post.Find(id);
p.Status = Status.New; // new status set here
p.Update();
SessionScope.Current.Flush();
transaction.Flush();
transaction.VoteCommit();
}
outsidePost.Refresh();
// refresh doesn't get the new status, status is still Status.Old
I am getting the following error in an Asp.Net Castle ActiveRecord app when trying to update an object:
"a different object with the same identifier value was already associated with the session"
I've looked up and down my code to see where else the object might have been created but I'm not seeing it. This is baffling as I have the exact same code on another page that works fine on updates
Now I'm thinking of trying to see where this other object is in the Session and either kill it or find out how it got into the session. How can I find this object?
[Update]
Ok, I finally found where the object is being called. However, I would still like to know how to find objects in the session for future reference.
I am in a situation where I have to perform a transaction master detail record (Drop prev details, insert new details, Update Master status) Master Business Object has 20 fields Details Business Object has 4 fields only. Now I have to update only 1 field in master table and 4 fields in details table for insert.
If I initialize a new master object, 19 fields are being wasted for a simple update. What do I do to efficiently handle this situation? Can I make a new object and inherit only one field from my master business object?
I've been stuck with this for days, and posted elsewhere online without success. If anyone can provide me with an answer to this problem I will arrange for beer to be sent to your chosen address....I have a DataTable containing multiple rows of data that I want to insert into a SQL 2005 table. The code works perfectly when the DataTable contains values that meet the SQL table schema design (e.g. all rows have a username, password, firstname & surname). However, when a value is missing or incorrectly entered (e.g. no firstname value), this causes a SqlException. I need to handle this in ASP.NET to provide a more user-friendly error message than what SQL gives, then rollback the whole transaction to cancel the transaction.The code attached is an imitation of how my data layer works. The error occurs on the RollBack() method. The error is: 'Object reference not set to an instance of an object'Can anyone explain why this happens? The SqlCommand object seems okay when I debug (it exists), but the Transaction object is lost as soon as the SqlException occurs. Although the transaction never commits when a SqlException is thrown, its a pretty ugly exit.My code design might be poor, in which I would welcome advice, but most important I need to figure out how to trap SqlExceptions without this error occuring, and Rollback as needed.The SqlException Numbers thrown are 2601 or 2627, both of which carry a severity level of 14, which is not high enough for the SqlCommand object to close the connection according to MSDN.The code looks lengthy but should be simple to follow...
We can catch the error log information by use EXEC xp_readerrorlog. I am just wondering is SQL have other types of log for us to reference information
I didn't wrote trigger for my tables... one table was missing, would it possible to know when the table was be deleted by some kind of transaction log?
What is the best way to format a transaction id?Conditions Max 15 characters: XXXXXXXXXXXXXXX -All transaction must be unique -Can contain both numerical and alphabetical characters -May contain Year, month, day
disconnected mode and transaction.it's give to me ERROR message
Quote.ExecuteReader requires the command to have a transaction when the connection assigned to the command is in a pending local transaction. The Transaction property of the command has not been initialized PHP Code: da.InsertCommand = cb.GetInsertCommand
my code is:
PHP Code: Dim con As New SqlConnection(ConfigurationManager.ConnectionStrings("DBCon").ConnectionString) Dim cmd As New SqlCommand("insert into Customer (customer_id, customer_name, note) values (@cid, @cname, @note)", con) Dim da As New SqlDataAdapter("select * from CustomerPhone", con)
table 1 [Code].... Table 2 [Code].... my stored procedure [Code]....
when ever i m passing the wrong the value in second table while updating its not updating the table but the problem it is inserting the value in first table i want the whole trans should proceed if success if not rollback
I want to know is there any method or any concept to save transactions before system crash or failure. I am doing project in C# and backend is sql server 2005.
i'm using the entity data model to insert data to my database. the thing is that when inserting data to more than one table i want to ensure that all actions completed correctly(or catch an exeption if not).
T is type YYYY is year MM is month DD is day N is sequencial number X is check digit
The problem is, how do I generate the sequencial number? since my primary key is not an auto increment integer value, if it was i would use that, but its not.
EDIT can I have the sequencial number resets itself after 1 day (24hours).
P201012080000000001X <-- first transaction of 2010/12/08 P2010120810000000002X <--- second transaction of 2010/12/08 P201012090000000001X <--- First transaction of 2010/12/09 (X is the check digit)
I am writing a simple ASP.NET MVC using session per request and transaction per request patterns (custom HttpModule).It seems to work properly, but.. the performance is terrible (a simple page loads ~7 seconds). For every http request, graphical resources incuding (all images on the site) a transaction is created and that seems to delay the loading times (without the transactions loading times per one image are ~1-10 ms with transactions they are over 1 second).What is the proper way to manage transactions in ASP.NET MVC + NH stack?
When i've put all transactions into my repository methods, for some obscure reasons I got 'implicit transactions' warning in NHProf (the SQL statements were executed outside transaction, even that in code session.Save()/Update()/etc methods were invoked within transaction 'using' scope and before transaction.Commit() call) BTW are implicit transactions really bad?
The problem is that the transaction is not working.For instance,now the code is correct so both sql statements are getting executed.However,yesterday the 'update' statement was incorrect but I could not realise that IT WAS NOT ALRIGHT, because the function was not throwing myTrans.Rollback().I had put a breakpoint and there was no rollback.Apparently, now the sql statements,above,are ok,so there is no issue at the moment,however if there was an error,still the function would execute as if the sql statements were successful.
I know that I can use a Stored procedure and finish with it.But i want to see it how the Transaction works using SQLtransaction class.
I have written several queries under one single transaction. When any of the query throws an error then the whole transaction should rollback. However, in some rare cases say 2% cases even after the error the next transaction is getting comitted.
note that all transaction processes (opening, committing and rollback) is done through .net.
I am using 64bit windows 2003 for data and application server. And website is configured for runapp32on64.
I have a multiple database operation, Have three tables (MSsql) and need to delete one row in each table in one operation, one after another. (Three functions, three rows of code). Everything is working as it should be, recently I was advised to use a transaction scope, which should guarantee the safety of deletion from all 3 tables together. Here is my new code: [Code]....
Locally all worked just fine, the transaction scope worked well, but when I have uploaded my application to my hosting server, I got an error of: The partner transaction manager has disabled its support for remote/network transactions. (Exception from HRESULT: 0x8004D025).I talked with the host support, they tried to do something, then I got this error: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)).
After a 2 days, They have contacted me, they said it is not possible to disable some restriction, that will allow an access to this operation, because I'm using shared hosting, and I need to upgrade my plan to VPS. VPS is a very expensive for me, and I can't afford it, What I'm looking is a some similar way of doing the same operation as transaction scope do, that may work at my hosting, At least I would like to try something else. Is there any additional way for the transaction scope?
i searched on google for a simple explanation of digest authentication but didn't find any good ones. How does it differ from Basic Authentication other than sending credentials as plain text?
There is a variations in time taken to execute the queries when we concider (setting) following options in a transactionsUsing the default connection Opening a Explicit connection Enable Pooling Disable Pooling
i'm dealing with an ASP.NET 4.0 Web Forms Application in which the DAL is built with a combination of LINQ-SQL and classic ADO.NET (for auditing transactions, and bulk updates).
I have an admin page on the site which performs an update on a bunch of records (could be thousands), and not to mention there is T-SQL triggers in place on those records. Needless to say, its a killer of an update.
So of course, the page is timing out. The update transaction is performing with the following code:
db.ExecuteCommand("UPDATE [tblFoo] SET [IsFoo] = 0 WHERE [Bar] = {0}", bar.Id);
So it's a classic ADO.NET bulk update.
What i've tried to do is make the call to this method asynchronous, by firing off a thread on the button click on the form:
[code]...
The method OnMyAsyncMethod simply executes the above ADO.NET call.
This solved the UI problem, being the page now posts back and refreshes immediately. But then around 30 seconds lateri see that wonderful little flashing light on my Visual Studio toolbar - "an unhandled exception has occured, would you like to attach to process, etc".
So of course, now the actual call in the DAL is timing out.
Am i doing this wrong - is there a way i can perform the update transaction (db.ExecuteCommand) totally asynchrously?
Hopefully you see what im trying to do - i just need to fire off a killer of a T-SQL transaction. The only thing i need back from the call is the number of rows updated.
I have a deadlock problem that occurs every 5 minutes on SQL update. I get the following error randomly - means qurey failed one time every 200 calls. I'm using transaction scope to manage transaction.
code:
using(TransactionScope scope = new TransactionScope()) { SELECT ... FROM TABLE1 UPDATE TABLE1 SET [F1] = @F1, [F2] = @F2, [F3] = @F3, [F4] = @F4, [F5] = @F5 WHERE UId = @UId scope.Complete(); } error: System.Data.SqlClient.SqlException: Transaction (Process ID 51) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction stack trace: at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at DAL.RunSQL(String query, SqlParameter[] parameters, Boolean openTransact) in C:prjDAL.cs:line 215 I took trace in SQL about deadlock and same SQL query is mentioned bu deadlock. I do not understand how to resolve this deadlock. SQL log: deadlock-list deadlock victim=process5462718 process-list process taskpriority=0 logused=0 waitresource=KEY: 20:72057597472604160 (ce004d0b917a) waittime=30 ownerId=5937428 transactionname=user_transaction lasttranstarted=2010-10-20T16:29:04.050 XDES=0x5d00280 lockMode=X schedulerid=2 kpid=2168 status=suspended spid=65 sbid=0 ecid=0 priority=0 trancount=2 lastbatchstarted=2010-10-20T16:29:04.110 lastbatchcompleted=2010-10-20T16:29:04.110 clientapp=.Net SqlClient Data Provider hostname=IPTBEWKS017 hostpid=3112 loginname=iptuserjde isolationlevel=serializable (4) xactid=5937428 currentdb=20 lockTimeout=4294967295 clientoption1=671088672 clientoption2=128056 executionStack frame procname=adhoc line=1 stmtstart=222 sqlhandle=0x0200000086adfa0c959ccbdd7ef0e31e854e3a987706ae38 UPDATE TABLE1 SET [F1] = @F1, [F2] = @F2, [F3] = @F3, [F4] = @F4, [F5] = @F5 WHERE UId = @UId frame procname=unknown line=1 sqlhandle=0x000000000000000000000000000000000000000000000000 unknown inputbuf (@UId nvarchar(9),@F1 nvarchar(9),@F2 nvarchar(9),@F3 int,@F4 int,@F5 datetime)UPDATE TABLE1 SET [F1] = @F1, [F2] = @F2, [F3] = @F3, [F4] = @F4, [F5] = @F5 WHERE UId = @UId process taskpriority=0 logused=0 waitresource=KEY: 20:72057597472604160 (cc0078aef293) waittime=88 ownerId=5937412 transactionname=user_transaction lasttranstarted=2010-10-20T16:29:04 XDES=0x2b028280 lockMode=X schedulerid=1 kpid=6788 status=suspended spid=74 sbid=0 ecid=0 priority=0 trancount=2 lastbatchstarted=2010-10-20T16:29:04.050 lastbatchcompleted=2010-10-20T16:29:04.050 clientapp=.Net SqlClient Data Provider hostname=IPTBEWKS017 hostpid=3112 loginname=iptuserjde isolationlevel=serializable (4) xactid=5937412 currentdb=20 lockTimeout=4294967295 clientoption1=671088672 clientoption2=128056 executionStack frame procname=adhoc line=1 stmtstart=222 sqlhandle=0x0200000086adfa0c959ccbdd7ef0e31e854e3a987706ae38 UPDATE TABLE1 SET [F1] = @F1, [F2] = @F2, [F3] = @F3, [F4] = @F4, [F5] = @F5 WHERE UId = @UId frame procname=unknown line=1 sqlhandle=0x000000000000000000000000000000000000000000000000 unknown inputbuf (@UId nvarchar(9),@F1 nvarchar(9),@F2 nvarchar(9),@F3 int,@F4 int,@F5 datetime) UPDATE TABLE1 SET [F1] = @F1, [F2] = @F2, [F3] = @F3, [F4] = @F4, [F5] = @F5 WHERE UId = @UId resource-list keylock hobtid=72057597472604160 dbid=20 objectname=dbipt_rc41_02.dbo.TABLE1 indexname=PK_TABLE1 mode=RangeS-U associatedObjectId=72057597472604160 owner-list owner id=processdbbe40 mode=RangeS-S waiter-list waiter mode=X requestType=convert keylock hobtid=72057597472604160 dbid=20 objectname=dbipt_rc41_02.dbo.TABLE1 indexname=PK_TABLE10 mode=RangeS-U associatedObjectId=72057597472604160 owner-list owner mode=RangeS-S waiter-list waiter id=processdbbe40 mode=X requestType=convert
I have tried to analyse the trace with this post but unsuccessfully: [URL] UId is my primary key - I do select on F3 column just before in same transaction but i have also an index on F3 column.
-> Spid 65 is running this query (line 2 of proc [p1]): UPDATE TABLE1 SET [F1] = @F1, [F2] = @F2, [F3] = @F3, [F4] = @F4, [F5] = @F5 WHERE UId = @UId Spid 74 is running this query (line 2 of proc [p2]): UPDATE TABLE1 SET [F1] = @F1, [F2] = @F2, [F3] = @F3, [F4] = @F4, [F5] = @F5 WHERE UId = @UId
Can I code to add transaction for some subs? If there is an error in any sub will roll back.For example, sub1 delete some tablessub2 insert data into tables which just be deletedsub3 send out confirmation emailsub4 make submit button disable