我正在尝试理解 Spring Transaction 概念。如下所示,我必须将数据插入两个不同的数据库(iSeries 和 DB2),但我们的 iSeries 版本不支持两阶段提交。要求是,仅当两个插入都成功时才应提交事务,否则应回滚。
如果我将传播用作 REQUIRED 或 REQUIRES_NEW,我会收到错误消息“非法尝试使用现有的两阶段资源提交单阶段资源”。
但是,如果我使用 NOT_SUPPORTED 或 SUPPORTS,它可以正常工作(即,如果其中一个插入失败,则事务回滚,否则如果两个插入都成功,它就会提交)。
我的理解是,如果 Propagation = SUPPORTS / NOT_SUPPORTED,那么在下面的场景中甚至不会启动 Transaction。因此,两个插入都可能在两个不同的数据库中独立发生,如果其中一个失败,整个事务不应该回滚。
但是 Propagation = SUPPORTS / NOT_SUPPORTED 根据我的要求工作。有人可以解释一下吗?提前致谢。
@Resource
private SessionFactory db2SessionFactory = null;
@Resource
private SessionFactory iSeriesSessionFactory = null;
@Transactional(propagation = Propagation.REQUIRED)
public void insert()
{
insertDB1();
insertDB2();
}
insertDB1()
{
db2SessionFactory .getCurrentSession().saveOrUpdate(obj1);
}
insertDB2()
{
iSeriesSessionFactory.getCurrentSession().saveOrUpdate(obj2);
}