SqlTransaction和嵌套事务

时间:2011-07-05 19:11:29

标签: .net sql ado.net sqltransaction

是否可以使用SqlTransaction类创建嵌套事务?如果是这样,我需要注意哪些规则/限制?

3 个答案:

答案 0 :(得分:2)

不幸的是,SQL Server忽略了内部事务的提交as in this MSDN article.

您可以嵌套交易,但请注意,行为可能与您的预期不符。

在最外面的事务提交之前没有任何提交。

所以,在下面......

transaction A
Query A

transaction B
Query B

Commit B
Rollback A

查询B的结果实际上没有提交给数据库。

答案 1 :(得分:1)

您可以在SqlTransaction类上使用Save(string savePointName)方法。这将创建一个保存点,您可以在该保存点内回滚事务。因此,如果部分代码失败,您将回滚到上一个保存点并重新开始。

示例:

SqlTransaction tran = _transaction as SqlTransaction;
tran.Save(savePointName);

当你失败时,你会做:

tran.Rollback(savePointName);

您可以多次执行此操作。这将解决您的嵌套事务问题。

答案 2 :(得分:0)

是的,可以创建嵌套事务。

例如:

transaction A
do action #1
transaction B
do action #2
transaction C
do action #3

rollback transaction B
transaction D
do action #4
commit transaction D
transaction E
do action #5

commit transaction A

使用此序列,实际上只会发生操作1,4和5。除了我所知道的事务限制之外,嵌套事务没有任何限制。唯一必须理解的是,在提交“顶级”(嵌套顶部)事务之前,实际上没有任何内容被提交。