我正在进行多个数据库的设置,技术堆栈的spring以及在tomcat 6上运行的hibernate。数据库之间的事务不是必需的,每个数据库都有自己的dataSource,sessionFactory和transactionManager(org.springframework.orm.hibernate3 .HibernateTransactionManager)具有事务管理的声明性使用(@Transactional注释)。最近需要有一个一次性的例子,即在两个DB(比如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吗?任何帮助都会非常感激。
答案 0 :(得分:2)
您可以对多个非JTA数据源使用编程式事务,但不会有任何全局事务。每个DataSource都将使用自己的独立事务,因此如果第一个提交而第二个提交回滚,则您将无法回滚已经提交的第一个事务。
Spring @Transactional annotation只能定位一个TransactionManager,而且由于您不使用JTA,您可以选择一个SessionFactory或DataSource。这就是为什么你只能依赖JtaTransactionManager
,如果你想要自动交易管理。如果您不想要JTA,则必须编写自己的事务管理代码。