我编写了在应用层实例化的TransactionContext类,并向下发送到业务和数据层,允许嵌套事务。现在我必须决定: 1.我是否应该使用显式事务并让每个函数在需要时调用事务的开始,提交或回滚? 2.我可以在创建TransactionContext时隐式启动事务,并让嵌套方法仅回滚
现在,我会使用第二种方法,因为它更容易编码:不用担心每个方法中的开始,提交或回滚,只需在事务上设置回滚标志,并且只让最顶层的方法担心提交或回滚。问题是我不确定在事务中包装所有数据库流量是否是个好主意。
在事务中包装所有数据库调用会产生什么负面影响?
我的设置是ASP.NET appliaction和MSSQL Server数据库。应用程序和数据库可能位于不同的服务器上,如果这会影响决策。
答案 0 :(得分:3)
单个SQL语句已经包含在隐式事务中。在需要它的地方使用一个事务,即在原子操作中更新多个表时。将所有调用包装到数据库中并不是一个好主意:它可能会导致吞吐量降低和阻塞。
Altough SQL Server支持嵌套的事务,它们可能无法正常工作:
提交内部交易是 被SQL Server数据库忽略 发动机。交易是 基于的承诺或回滚 采取的行动在结束时 最外面的交易。如果外面 交易是承诺的,内在的 嵌套交易也是 承诺。如果外部交易是 回滚,然后全部内心 交易也会回滚, 无论内在是否 交易是个别的 提交。