Spring事务管理以回滚选中的异常
我正在使用Spring“@Transactional”注释来处理事务Spring事务管理以回滚选中的异常,spring,Spring,我正在使用Spring“@Transactional”注释来处理事务 @Transactional(readOnly = false,propagation=Propagation.REQUIRES_NEW,isolation=Isolation.READ_UNCOMMITTED,rollbackFor=SQLException.class) public void updateBatch(Report a) throws SQLException, DataAccessE
@Transactional(readOnly = false,propagation=Propagation.REQUIRES_NEW,isolation=Isolation.READ_UNCOMMITTED,rollbackFor=SQLException.class)
public void updateBatch(Report a)
throws SQLException, DataAccessException { insert1();insert2(); insert3(); }
但万一
- insert1()-成功将数据插入表A中
- insert2()-成功插入表b中的数据
- insert3()-抛出选中的异常,不在表C中插入数据
请务必让我知道我缺少什么您在insert1和insert2中做什么 他们正在使用另一个具有
传播的事务。需要新的属性吗?如果是,则不会回滚。否则,您将在insert1或insert2中回滚吗
我也经历过同样的问题。虽然它可能和你的有点不同。我遇到的情况是你有两个服务a和B
A正在try-catch块中调用B的方法。B抛出RuntimeException,A的catch块将该异常包装为捕获的异常
在我的场景中发生了什么:
-B是事务代理后面的单独类
-B抛出一个运行时异常,该异常将事务设置为回滚
-正如我对Propagation.required所做的那样,它与A方法的事务是相同的
-A包装异常并将其抛出,因为异常既不是RuntimeException也不是Error,提及方法将不会进入transactionManager.rollback,而是进入transactionManager.commit
-这将抛出UnexpectedRollback,因为事务以前被标记为rollback
您的情况可能会有所不同。您遇到此错误b/c Spring正在尝试提交一个您的方法之一标记为“回滚”的事务。您是否也使用事务性方法对insert方法进行了注释?实际上insert1()、insert2()、insert3()是ibatis函数,它们只是将数据插入表中,如sqlMapper.insert(“insertAccount”,account)代码>实际上insert1()、insert2()、insert3()是ibatis函数,它们只是在表中插入数据,我读取了您的场景,因此在最后您是否能够回滚由checekd异常的bcz触发的事务在给定场景中,B回滚,但A不回滚,这会引发意外的回滚异常。如前所述,您是否将事务性方法置于插入方法之上?如果是,用什么方法传播?