1、事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚
其实像第一种try catch这种把整个包裹起来,这种业务方法也就等于脱离了spring事务的管理,因为没有任何异常会从业务方法中抛出,全被捕获并“吞掉”,导致spring异常抛出触发事务回滚策略失效。
@Transactional(readOnly = false) public void delete(Comment entity, Boolean isRe) { DefaultTransactionDefinition def = new DefaultTransactionDefinition(); // explicitly setting the transaction name is something that can only be done programmatically def.setName("SomeTxName"); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); TransactionStatus status = transactionManager.getTransaction(def); try { super.delete(entity); } catch (Exception ex) { // 事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚 inspection transactionManager.rollback(status); throw ex; } }
2、事务传播行为:
int PROPAGATION_REQUIRED = 0;// 必需的--如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
int PROPAGATION_SUPPORTS = 1;// 支持当前事务,如果当前没有事务,就以非事务方式执行。
int PROPAGATION_MANDATORY = 2;// 强制的、命令的--使用当前的事务,如果当前没有事务,就抛出异常。
int PROPAGATION_REQUIRES_NEW = 3;// 新建事务,如果当前存在事务,把当前事务挂起。
int PROPAGATION_NOT_SUPPORTED = 4;// 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
int PROPAGATION_NEVER = 5;// 以非事务方式执行,如果当前存在事务,则抛出异常。
int PROPAGATION_NESTED = 6;// 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。
3、