1

我正在使用一个名为ECO的对象持久性框架来将数据更新到 SQL Server。我注意到,如果我创建一个 TransactionScope,然后在我的第一个事务提交之后但在我的第二个事务提交之前故意抛出异常,则第一个数据库被更新,而第二个则没有。

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

谁能想到为什么这会允许第一个数据库更新但第二个数据库不更新的情况?

4

1 回答 1

1

知道了!

ECO 支持以下数据库...

  1. 黑鱼
  2. DB2
  3. 火鸟
  4. 模仿者
  5. mysql
  6. 连结数据库
  7. 甲骨文
  8. SQLite
  9. SQL服务器
  10. 赛贝斯
  11. Borland 数据提供者
  12. Borland 数据库 eXpress (DBX)

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

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

因此,该连接未在当前分布式事务中登记。考虑到 SqlConnection 自己进行池化,将 PersistenceMapperSqlServer.MaxPoolSize 设置为零是可以接受的。

现在它使用 SqlConnection 组件来处理连接的创建/处置,该组件不仅将连接池化,而且还可以正确处理分布式事务!

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

于 2010-10-18T09:36:53.780 回答