【问题标题】:TransactionScope vs. IDbTransactionTransactionScope 与 IDbTransaction
【发布时间】:2011-03-17 09:28:55
【问题描述】:

与 IDbTransaction 相比,使用 TransactionScope 有哪些优点/缺点?我会建议一些 - 请更正/完成列表。

TransactionScope的优势:

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

TransactionScope 的缺点:

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

【问题讨论】:

    标签: .net database transactions transactionscope


    【解决方案1】:

    方便非常重要——尤其是因为它可以用来包装你无法控制的代码(因为你包装的代码会自动登记,默认情况下)。这意味着您可以包装使用服务器的预先存在的库

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

    另一个缺点是嵌套事务不能回滚; 任何回滚立即回滚外部事务。我个人喜欢这种方法;如果出现问题 - 尽快停止。

    关于您在第 3 点中的查询;您可以在事务范围内打开/关闭任意数量的连接,而不会影响行为,除了您可能会发现(取决于具体情况)您的事务提升到 DTC。如果您与多个交易感知服务器交谈,几乎可以保证提升。

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

    【讨论】:

    • 感谢您的出色回答。我想澄清你对我的第三点的回答。 TransactionScope 真的支持在事务期间关闭连接吗?我认为数据库需要保持连接打开才能提交事务......
    • @ldsa 它是书面的;随意测试它:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 2012-04-08
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多