手动处理事务而不是 JtaTransactionManager
Manually handle transactions instead of JtaTransactionManager
我正在使用多个数据库进行设置,技术堆栈 spring 在 tomcat 上使用休眠 运行 6. 跨数据库事务不是必需的,每个数据库都有其自己的 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 吗?非常感谢任何帮助。
您可以对多个非 JTA 数据源使用编程事务,但不会有任何全局事务。每个 DataSource 都将使用自己独立的事务,因此如果第一个提交而第二个回滚,您将没有机会回滚已经提交的第一个事务。
Spring @Transactional annotation 只能针对一个 TransactionManager,并且由于您不使用 JTA,您可以选择一个 SessionFactory 或 DataSource。这就是为什么如果你想要自动事务管理,你只能依靠 JtaTransactionManager
。如果你不要JTA,你就得自己写事务管理代码了。
我正在使用多个数据库进行设置,技术堆栈 spring 在 tomcat 上使用休眠 运行 6. 跨数据库事务不是必需的,每个数据库都有其自己的 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 吗?非常感谢任何帮助。
您可以对多个非 JTA 数据源使用编程事务,但不会有任何全局事务。每个 DataSource 都将使用自己独立的事务,因此如果第一个提交而第二个回滚,您将没有机会回滚已经提交的第一个事务。
Spring @Transactional annotation 只能针对一个 TransactionManager,并且由于您不使用 JTA,您可以选择一个 SessionFactory 或 DataSource。这就是为什么如果你想要自动事务管理,你只能依靠 JtaTransactionManager
。如果你不要JTA,你就得自己写事务管理代码了。