[英]How to implement nested SQL transactions with ADO.NET?
我需要使用ADO.NET在.NET中实现嵌套事务。
情况如下:
--> Start Process (Begin Transaction)
--> Do DB things
--> Begin Transaction for step 1
--> Step 1
--> Commit transaction for step 1
--> Begin transaction for step 2
--> Step 2
--> Rollback transaction for step 2
--> etc ...
--> Do DB things
--> End Process(Commit or Rollback ALL commited steps --> a.k.a the process)
交易范围可以做到吗? 有人可以举一个例子吗?
另外,我需要该过程适用于SQL Server 2005和Oracle 10g数据库...事务作用域是否可以同时用于两个数据库引擎?
编辑:请注意这种情况可能会发生:
步骤1提交,步骤2回滚步骤3提交。
该过程已提交
(Step1和Step3确实将数据存储到数据库中,而step2 则没有 )
另一方面...
步骤1提交,步骤2回滚步骤3提交。
该过程将回滚。
没有数据提交到数据库
注意:没有可用的数据库架构或域值
您可以在TSQL中通过保存点(在SQL Server上为SAVE TRAN
)来做到这一点,但坦率地说,我不建议这样做。 您无法通过TransactionScope
来执行此操作,因为任何终止都将终止(一旦树中的任何事务指示失败,整个事务都会回滚)。
个人:首先检查数据,然后仅执行有效操作。 如果失败,则为终端-将其回滚。 可能将工作分成原子单元,这些原子单元可以独立地真正提交(或回滚)。
本文讨论保存点和嵌套事务。
在Oracle上:
BEGIN
SAVEPOINT STEP1;
-- do some things
IF your_criteria_for_commit_is_needed THEN
NULL; -- do nothing
ELSE
ROLLBACK TO SAVEPOINT STEP1;
END IF;
SAVEPOINT STEP2;
-- do some other things
IF your_other_criteria_for_commit_is_needed THEN
NULL; -- do nothing
ELSE
ROLLBACK TO SAVEPOINT STEP2;
END IF;
-- SOME NUMBER OF OTHER STEPS
IF your_criteria_for_all_step_commit_is_needed THEN
COMMIT; -- commit all changes to DB
ELSE
ROLLBACK; -- rollback all changes
END IF;
END;
/
如果您希望所有步骤都被落实或不执行,那么一笔交易会更合适吗? 您可以将现有的事务对象传递给ADO.Net Command对象的构造函数 ,从而在单个事务的范围内执行多个更新。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.