@Transactional注解的使用:
1、在方法或者类上都可以添加。(如果在类上添加,则此类中的所有方法都会执行事务,不推荐,因为可能后续接手开发的小伙伴添加方法的时候根本不需要执行事务);
2、触发事务回滚有两种方式:
- a. 方法抛出异常自动进行回滚;如果使用了try catch,要在catch中抛出异常;
- b. 手动执行回滚:在方法中添加:TransactionAsceptSupport.currentTransactionStatus().setRollBackOnly();
-
//第1种写法 @Transactional( rollbackFor = {Exception.class} ) public String commonMoney(Receipt rpt,Moneyrecord mors){ try{ rpt.setState(1); int a=dao.insert(rpt); if(a<=0) { return"缴费失败"; } mors.setPric(rpt.getPic()); mors.setExid(rpt.getPid()); mors.setState(1); boolean tf=mrs.custom(mors); if(!tf){ return"余额不足"; } }catch(Exception e){ log.error("业务异常" , e) throw new Exception(); } return "OK"; } //第2种写法 @Transactional( rollbackFor = {Exception.class} ) public String commonMoney(Receipt rpt,Moneyrecord mors){ rpt.setState(1); int a=dao.insert(rpt); if(a<=0) { return"缴费失败"; } mors.setPric(rpt.getPic()); mors.setExid(rpt.getPid()); mors.setState(1); boolean tf=mrs.custom(mors); if(!tf){ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return"余额不足"; } return "OK"; }
3、推荐在注解上添加@Transactional(rollbackFor = {Exception.class}),如果不加的话,方法默认只会在抛出RuntimeException时执行回滚;
原理:
添加了@Transactional注解的A类在启动后,默认会生成一个B类,复制A类中的所有方法,如果是在A类上添加注解,则B类所有方法都会执行事务;如果只在A类某个方法上添加注解,则B类只会对那个方法执行事务。
版权声明:本文为zsyoung原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。