【问题标题】:Should I wrap every db call in transaction?我应该在事务中包装每个数据库调用吗?
【发布时间】:2011-09-27 14:21:36
【问题描述】:

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

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

将所有数据库调用封装在事务中可能会产生哪些负面影响?

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

【问题讨论】:

    标签: database language-agnostic transactions


    【解决方案1】:

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

    虽然 SQL Server 支持嵌套事务,但它们可能无法按预期工作:

    提交内部事务是 被 SQL Server 数据库忽略 引擎。该交易是 提交或回滚基于 结束时采取的行动 最外层事务。如果外 事务提交,内部 嵌套事务也是 坚定的。如果外部事务是 回滚,然后全部内部 事务也被回滚, 不管是否内 交易是单独的 承诺。

    参考:Nesting Transactions

    【讨论】:

      猜你喜欢
      • 2019-06-04
      • 2014-08-09
      • 2012-12-31
      • 2012-06-14
      • 1970-01-01
      • 2010-09-26
      • 1970-01-01
      • 1970-01-01
      • 2013-02-07
      相关资源
      最近更新 更多