2011-09-22 55 views
4

我正在使用两个不同的数据库。我使用两个不同的会话从两个数据库中删除记录。代码如下:休眠 - 两个不同的事务将成功提交

try{ 
    Session session1 = factory.getSession(); 
    Transaction trn1 = session1.beginTrn(); 
    session1.delete(foobar); 
    trn1.commit(); 

    Session session2 = jbomContext.getGrahpSession(); 
    Transaction trn2 = session2.beginTrn(); 
    session2.delete(box);`enter code here` 
    trn2.commit(); 
}catch(Exception e){ 
    trn1.rollback(); 
    trn2.rollback(); 
} 

在这里,问题是,如果是发生在transaction2错误我无法回退transaction1.I有一些想法大约两阶段提交。但我需要回滚事务,如果异常会发生这两个事务。

回答

3

您不能回滚tr1(如果tr2的提交失败),因为到那时tr1已经被提交。至少我没有看到在冬眠中这样做的原生方式。如果您使用的是完整的Java EE应用服务器,或者可以通过其他方式启用它(如this和Spring的JtaTransactionManager),那么您可以做的就是使用分布式事务(JTA数据源)。