【问题标题】:Manually handle transactions instead of JtaTransactionManager手动处理事务而不是 JtaTransactionManager
【发布时间】:2015-03-25 19:14:41
【问题描述】:

我正在使用多个数据库进行设置,技术堆栈的 spring 与在 tomcat 6 上运行的 hibernate。跨数据库的事务不是必需的,每个数据库都有自己的 dataSource、sessionFactory 和 transactionManager (org.springframework.orm.hibernate3 .HibernateTransactionManager) 声明式使用事务管理(@Transactional 注释)。最近需要一次性在其中两个数据库(比如 db1 和 db2)中进行事务性插入。

我知道有像 JOTM 和 atomikos 这样的第三方库可以为 tomcat 添加 JTA 支持。但我想知道是否可以手动管理交易。

比如可以有下面这样的吗?

Transaction transactionDb1 =     sessionFactoryDb1.getCurrentSession().beginTransaction();
Transaction transactionDb2 = sessionFactoryDb2.getCurrentSession().beginTransaction();
try
{
    // DAO layer call to DB1
    // DAO layer call to DB2

    transactionDb1.commit();
    transactionDb2.commit();
}
catch (Exception e) {
    transactionDb1.rollback();
    transactionDb2.rollback();
}

它可能不会那么简单。但这样的事情可能吗?据我所知,可以使用程序化事务处理。但是我该如何结合声明性方法呢?我还能在其他情况下使用@Transactional 吗?任何帮助将不胜感激。

【问题讨论】:

  • 那么,你想分离出两个数据库的事务吗?即使一个失败,另一个也应该提交?
  • 其实没有。理想情况下,代码应该是 if(transactionDb1.wasCommitted()) transactionDb2.commit() else //rollback both

标签: java spring hibernate tomcat spring-transactions


【解决方案1】:

您可以对多个非 JTA 数据源使用编程事务,但不会有任何全局事务。每个 DataSource 将使用自己的隔离事务,因此如果第一个提交而第二个回滚,您将没有机会回滚已经提交的第一个事务。

Spring @Transactional annotation 只能针对一个 TransactionManager,并且由于您不使用 JTA,因此您可以选择一个 SessionFactory 或 DataSource。这就是为什么你只能依靠JtaTransactionManager,如果你想要自动事务管理。如果您不想要 JTA,则必须编写自己的事务管理代码。

【讨论】:

  • 啊……嗯……我就是这么想的。没有 JTA 就没有(更容易)的方式。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多