我应该在事务中包装每个db调用吗?

时间:2011-07-03 11:08:51

标签: database language-agnostic transactions

我编写了在应用层实例化的TransactionContext类,并向下发送到业务和数据层,允许嵌套事务。现在我必须决定:  1.我是否应该使用显式事务并让每个函数在需要时调用事务的开始,提交或回滚?  2.我可以在创建TransactionContext时隐式启动事务,并让嵌套方法仅回滚

现在,我会使用第二种方法,因为它更容易编码:不用担心每个方法中的开始,提交或回滚,只需在事务上设置回滚标志,并且只让最顶层的方法担心提交或回滚。问题是我不确定在事务中包装所有数据库流量是否是个好主意。

在事务中包装所有数据库调用会产生什么负面影响?

我的设置是ASP.NET appliaction和MSSQL Server数据库。应用程序和数据库可能位于不同的服务器上,如果这会影响决策。

1 个答案:

答案 0 :(得分:3)

单个SQL语句已经包含在隐式事务中。在需要它的地方使用一个事务,即在原子操作中更新多个表时。将所有调用包装到数据库中并不是一个好主意:它可能会导致吞吐量降低和阻塞。

Altough SQL Server支持嵌套的事务,它们可能无法正常工作:

  

提交内部交易是   被SQL Server数据库忽略   发动机。交易是   基于的承诺或回滚   采取的行动在结束时   最外面的交易。如果外面   交易是承诺的,内在的   嵌套交易也是   承诺。如果外部交易是   回滚,然后全部内心   交易也会回滚,   无论内在是否   交易是个别的   提交。

参考:Nesting Transactions