代码之家  ›  专栏  ›  技术社区  ›  Peter Morris

为什么TransactionScope不回滚分布式事务?

  •  1
  • Peter Morris  · 技术社区  · 14 年前

    我正在使用一个名为 ECO 用于将数据更新到SQL Server。我注意到,如果我创建了一个TransactionScope,然后在第一个事务提交之后但在第二个事务提交之前故意抛出一个异常,那么第一个数据库将被更新,而第二个数据库则不会更新。

    我认为,一旦分布式事务处理协调器在主数据库上运行,只需围绕大量更新创建TransactionScope就可以了?

    有人能想到为什么这会允许第一个数据库被更新而不是第二个数据库被更新的场景吗?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Peter Morris    14 年前

    知道了!

    ECO支持以下数据库…

    1. 黑鱼
    2. DB2
    3. 火鸟
    4. 模仿者
    5. MySQL
    6. NEXSUBDB
    7. 甲骨文公司
    8. 数据库
    9. SQLServer
    10. 赛贝斯
    11. Borland数据提供商
    12. Borland数据库Express(DBX)

    今天早上我记得其中一些不支持连接池,所以抽象的PersistenceMapper类Eco实现了自己的连接池。这就是发生的事情

    1. 应用程序启动
    2. 我已经选择将我的对象映射信息存储在数据库中,所以eco得到一个连接并读取该映射信息
    3. eco返回到池的连接,但返回自己的池
    4. 稍后启动分布式事务
    5. 我将对象更新到数据库
    6. eco从自己的池中检索连接

    因此,当前分布式事务中不登记连接。考虑到sqlconnection有自己的池,可以将PersistenceMappersQLServer.MaxPoolSize设置为零。

    现在,它使用sqlconnection组件来处理连接的创建/处理,不仅该组件对连接进行池处理,而且还正确地处理分布式事务!

    我已经写信给开发人员让他们知道,他们应该将这个属性标记为已过时。