Spring事务回滚的两种方法

当然,Spring事务回滚的前提是你当前使用的数据库必须支持事务,比如MySQL的Innodb是支持的,但Mysaim则是不支持事务的。

方法一

  1. 使用 @Transaction 来配置自动回滚,可以配置在类上,也可以配置在方法上(作用域不同),但对final或private修饰的方法无效,且该类必须是受spring所管控的,也就是被已经被注入的类,而不是new出来的类。

  • 若配置在方法上,则该方法被加上了事务

  • 若配置在类上,则等于给该类的所有方法都加上了该注解。此时如果在该类下的某个方法也加了 @Transaction ,则该方法使用自己的配置,其他方法使用类上的配置。

@Service@TransactionalpublicclassUserServiceImplimplementsUserService {
    @Overridepublicvoidsave(User user) {
        //some code//db operation
    }
}
复制代码
  1. 若被配置的方法或类抛出了异常,则事务会被自动回滚,除非你在该方法中手动捕获了异常,且没有抛出新的异常。

可以使用 @Transactional(rollbackFor = Exception.class) 来设定针对特定的异常进行事务回滚,如果不设置则默认会回滚 RuntimeException and Error (参考自源码内文档)。

@Service@Transactional(rollbackFor = Exception.class)publicclassUserServiceImplimplementsUserService {
    @Resource
	private UserMapper userMapper;
    
    @Overridepublicvoidsave(User user) {
        userMapper.insert(user);
        thrownewRuntimeException(); // 抛出异常,事务回滚,上面的insert插入失败。
    }
}
复制代码

方法二

通过注入 DataSourceTransactionManager 来手动开启事务,手动回滚事务,用于抛出异常被catch后,进行手动回滚,可控程度更高,可以更灵活的使用。

  1. 先注入 DataSourceTransactionManager 事务管理对象

  1. new 一个 DefaultTransactionDefinition def = new DefaultTransactionDefinition(); 对象

  1. 使用 TransactionStatus status = transactionManager.getTransaction(def);来开启一个事务,

  1. 使用 transactionManager.rollback(status); 来回滚这个事务

  1. 使用 transactionManager.commit(status); 来提交这个事务

@ServicepublicclassUserServiceImplimplementsUserService {
   @Autowiredprivate DataSourceTransactionManager transactionManager;

   @Override@Transactionalpublicvoidsave(User user) {
       DefaultTransactionDefinitiondef=newDefaultTransactionDefinition();
       // explicitly setting the transaction name is something that can only be done programmatically
       def.setName("SomeTxName");
       def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

       TransactionStatusstatus= transactionManager.getTransaction(def);
       try {
           // execute your business logic here//db operation
       } catch (Exception ex) {
           transactionManager.rollback(status);
           throw ex;
       }
   }
} // 此代码案例来自Alibaba Coding Guidelines

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值