TransactionScope与IDbTransaction的区别

14

使用TransactionScope相比IDbTransaction的优缺点是什么?下面是一些建议,请补充/更正列表。

TransactionScope的优势:

  1. TransactionScope支持分布式事务 - 您可以在一个事务中访问多个数据源或使用多个连接到一个数据源。
  2. TransactionScope更加声明式:我们可以嵌套TransactionScopes,在服务层中使用它更加方便(我们不必自己处理IDbConnection和IDbTransaction)。
  3. 第三点我不确定,但是在这里。IDbTransaction特定于连接 - 您必须在整个事务期间保持连接打开状态。我不确定在整个TransactionScope期间是否应该打开连接/连接(请澄清)。如果没有,可以执行以下工作流程:开始事务,打开连接 - 查询 - 检索 - 关闭连接,执行资源密集型计算(保持连接关闭),打开连接 - 查询 - 检索 - 关闭连接,...,提交事务。但我想TransactionScope不可能保持连接打开直到提交。

TransactionScope的缺点:

  1. 它不支持在事务期间更改IsolationLevel。
1个回答

18

方便非常重要 - 特别是当它可以用来包装无法控制的代码(因为默认情况下,您包装的代码将自动注册)。这意味着您可以包装使用服务器的预先存在的库。

性能会有轻微影响,但请注意,在许多情况下,您将使用轻量级事务管理器而不是DTC - 这意味着您不需要支付完整的DTC成本。

另一个缺点是无法回滚嵌套事务; 任何回滚立即回滚外部事务。个人认为这种方法很好; 如果事情变得不好 - 尽快停止它们。

关于您在第3点中的查询; 您可以在事务范围内打开/关闭任意数量的连接,而不会影响行为,除非您发现(根据情况)您的事务升级到DTC。如果您与多个支持事务的服务器通信,则几乎可以保证会升级。

另一个区别:不同的超时时间适用,特别是当涉及到DTC时。这是有道理的:长时间运行的分布式事务是有害的,并且可能表示跨服务器死锁。死锁通常在单个服务器上检测到,但在分布式情况下几乎不可能自动发现,因此硬超时是必不可少的。

1
谢谢您的出色答案。我想澄清一下您对我的第三点回答。TransactionScope确实支持在事务期间关闭连接吗?我认为数据库需要保持连接打开才能提交事务... - SiberianGuy
1
@ldsa 就按照原文来;随意测试即可 :) - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接