I have a scenario in which I have to process multiple .sQL
files, every file contains 3-4 insert or Update queries, now when any query in a file fails I do rollback
whole transaction means whole file we be rolled back , and all other files executed before that file will get committed, I want an option where user can rollback
entire transaction means all queries in a file executed and all files executed before that particular file containing error, and if user wants to skip that particular file with error we will just rollback
single file which contains error all other files will get committed, I am using SQL Transaction right now , no TransactionScope
but obviously I can switch too TransactionScope()
if needed and possible,
Currently pseudo for my code (what i want) is as follows
Var Files[]
for each (string query in Files)
{
Execute(Query)
IF(TRUE)
CommitQuery()
Else
result=MBOX("IF You want to abort all files or skip this one")
if(result=abort)
rollbackall()
else
QueryRollBack()
}
It seems you are looking for SavePoints, i.e. the option to partially roll back and then resume a larger transaction. AFAIK
TransactionScope
doesn't support SavePoints so you'll need to deal directly with the native provider (e.g.SqlClient
if your RDBMS is Sql Server). (i.e. you cannot leverage the ability ofTransactionScope
to implementDTC
equivalent ofSavePoints
, e.g. across distributed databases, disparate RDBMS, or parallel transactions)That said, I would suggest a strategy where the user elects to skip or abort up front, before transactional processing begins, as it will be expensive awaiting UI response while a large number of rows are still locked - this will likely cause contention issues.
Edit
Here's a small sample of using
SavePoints
. Foo1 and Foo3 are inserted, Foo2 is rolled back to the preceding save point.Where
InsertFoo
is:And the underlying table is:
Keep all insert, update queries in a
try{..}catch(..){..}
and if any exception occurs, in the catch roll the db transaction back.