在 MyBatis-Plus 和 Spring 的事务管理机制中,事务的回滚行为与异常的传播有很大关系。如果你捕获了异常并且没有将它重新抛出,那么事务是不会回滚的。
这是因为 @Transactional
注解默认只在未捕获的异常向上传播到 Spring 的事务管理器时,才会触发回滚。捕获异常后,Spring 不再认为这个操作是失败的,事务将正常提交。
示例
捕获异常且不回滚
如果你捕获了异常并且没有抛出它,事务不会回滚:
@Transactional
public void someTransactionalMethod() {
try {
// 业务逻辑
} catch (Exception e) {
// 捕获异常,没有抛出
// 此时事务不会回滚,除非手动调用 setRollbackOnly
}
}
捕获后手动回滚
如果你需要在捕获异常的情况下仍然回滚事务,可以通过以下两种方式处理:
-
手动设置回滚:通过
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
手动标记当前事务为回滚状态:@Transactional public void someTransactionalMethod() { try { // 业务逻辑 } catch (Exception e) { // 捕获异常后,手动回滚事务 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } }
-
重新抛出异常:在捕获异常后将其重新抛出,让
@Transactional
注解感知异常,从而自动回滚事务:@Transactional public void someTransactionalMethod() { try { // 业务逻辑 } catch (Exception e) { // 捕获异常后重新抛出 throw new RuntimeException(e); } }