【问题标题】:Does Spring.NET [Transaction] attribute support multiple transaction managers?Spring.NET [Transaction] 属性是否支持多个事务管理器?
【发布时间】:2012-01-31 15:26:08
【问题描述】:

一段时间以来,我一直在将 IBatis 与 TxScopeTransactionManager 结合使用的代码库中使用 Spring.NET 声明式事务管理。我刚刚向项目添加了 Spring.NET NHibernate 支持(使用 OSIV 模式),没有问题。 NHibernate 将仅用于新功能,ADO.NET/IBatis 遗留数据访问代码仍需要按原样工作。所以我现在在我的上下文中有两个不同的事务管理器:

  1. Spring.Data.Core.TxScopeTransactionManager(现有 Tran Mgr)
  2. Spring.Data.NHibernate.HibernateTransactionManager(为 Nhibernate 添加)

但是,看起来 Spring.NET 只允许将单个 TransactionManager 绑定到 Transaction 属性,因为使用此属性修饰的旧服务方法现在使用 HibernateTransactionManager 而不是 TxScopeTransactionManager 来提交或回滚事务。这是有问题的,因为 HibernateTransactionManager 不知道任何非 nHibernate(读取 ADO.NET)连接。

有没有办法让 [Transaction] 使用不同的事务管理器,可能与 ObjectNameAutoProxyCreator 一起根据命名空间包含/排除服务类?

如果没有,有没有办法让一个事务管理器同时处理 NHibernate 和 IBatis 事务?

我使用 HibernateTransactionManager 对此进行了测试,以管理这两种数据访问策略,但我的 IBatis 事务没有回滚。这特别奇怪,因为我可以在 SQL Profiler 中看到 Begin TranRollback Tran 都由 HibernateTransactionManager 发送,但数据仍然被提交。

如果我使用 TxScopeTransactionManager,那么我的 IBatis 事务会成功回滚,但 NHibernate 对数据库的写入永远不会刷新。

【问题讨论】:

    标签: .net transactions aop spring.net


    【解决方案1】:

    根据the Java documentation@Transaction属性在Spring的Java实现中有一个额外的参数用来引用事务管理器来使用。 这在今天的 spring.net 中不存在(我在 1.3.2 版本中没有找到它)但我发现了一个 DelegatingTransactionAttributeWithName 乍一看似乎相关但我不知道如何使用它。

    尽管如此,即使您没有使用多个 TransactionManagers 的以下可能性:

    • 通过从 AbstractPlatformTransactionManager 派生并扩展 [Transaction] 属性来实现您自己的“DelegatingTransactionManager”,以模仿 Java 世界已有的行为。
    • 使用声明性事务注释而不是基于代码的属性并定义单独的事务管理器。

    如果你打算走后面的路线,你需要:

    即使我自己没有尝试过,这也应该可以。又是 Java 人 were first 并从那里发展而来的......

    【讨论】:

      猜你喜欢
      • 2021-01-01
      • 2013-07-24
      • 2017-01-24
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多