赞
踩
@Transactional注解的原理:
添加了@Transactional注解的A类在启动后,默认会生成一个B类,复制A类中的所有方法,如果是在A类上添加注解,则B类所有方法都会执行事务;如果只在A类某个方法上添加注解,则B类只会对那个方法执行事务。
@Transactional注解的使用:
1、在方法或者类上都可以添加。(如果在类上添加,则此类中的所有方法都会执行事务,不推荐,因为可能后续接手开发的小伙伴添加方法的时候根本不需要执行事务;也不建议在接口上添加);
2、推荐在注解上添加@Transactional(rollbackFor = {Exception.class}),如果不加的话,方法默认只会在抛出RuntimeException(unchecked异常)时执行回滚;
3、@Transactional注解只能应用到public修饰符上,其它修饰符不起作用,但不报错。
4、触发事务回滚有两种方式:
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";
}
不回滚原因
1,检查方法是不是public
2,检查异常是不是unchecked异常
3,如果是checked异常也想回滚的话,注解上写明异常类型即可@Transactional(rollbackFor=Exception.class)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。