【问题标题】:Unwanted promotion using TransactionScope使用 TransactionScope 进行不需要的促销
【发布时间】:2011-05-01 01:09:08
【问题描述】:

我有一个用 C#.net 2.0,sql 2005 编写的系统,其中业务层和数据访问层已经创建并使用 MSDTC 事务。连接的创建和打开、关闭等都写在数据访问层的各个方法中。

我正在迁移到一个新系统,该系统重用旧的业务和数据访问层,并在其自己的业务层和数据访问层中提供新功能。

我希望每次交易都在 LTM 进行,并注意晋升为 MSDTC。

如果我在业务层使用 TransactionScope 编写并在内部调用多个 DAC 方法,则事务将提升为 DTC。对于新类,我可以通过在事务范围开始之前在业务层中打开和关闭连接来处理这个问题,但是对于旧的书面类我可以做些什么。 .Net 4.0 中有没有办法处理正在提升的事务范围? 我将 WCF 用于新服务,将 .net 4.0 用于新系统。

【问题讨论】:

    标签: sql wcf transactionscope


    【解决方案1】:

    默认情况下,新打开的连接会加入当前事务。如果事务在多个连接(资源)上运行,它会自动提升为 MSDTC。您可以通过在连接字符串中指定Enlist=false 来强制SQL 连接不加入当前事务。

    如果每个旧类都使用自己的连接,您应该使用 MSDTC,否则您的业务逻辑执行的多个数据更改不会在一个事务中进行。示例:

    using (var scope = new TransactionScope())
    {
        DalA.DoSomething();  
        DalB.DoSomething();
        scope.Complete();
    }
    

    DalA 和 DalB 都使用自己的连接。如果您使用Enlist=false,它们将不会在事务中,如果 DalB.DoSomething 失败,它将不会回滚 DalA.DoSomething。

    正确的方法是使用 MSDTC 或重写旧类以使用一个连接。本地事务仅适用于一种资源(连接)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多