引言:最近在优化项目的代码,然后使用的是阿里的P3C代码规范检查,然后就出现了如下的提示。
方法【create】需要在Transactional注解指定rollbackFor或者在方法中显示的rollback。
原因:
解决方案之一:在此方法@Transactional注解后面加上(rollbackFor = Exception.class),如图所示:
解决方案之二:@Transactional注解上不加rollbackFor这个属性,在try…catch…的catch里写上如何回滚。
下面代码的三种方案都是正确的(第一种是在类级别的注解上,第二种是在方法级别的注解上,第三种是在捕获异常后在catch里写上)
事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务。
Positive example 1:
/**
* @author hjm
* @date 2019/07/09
*/
@Service
@Transactional(rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {
@Override
public void save(User user) {
//some code
//db operation
}
}
Positive example 2:
/**
* @author hjm
* @date 2019/07/09
*/
@Service
public class UserServiceImpl implements UserService {
@Override
@Transactional(rollbackFor = Exception.class)
public void save(User user) {
//some code
//db operation
}
}
Positive example 3:
/**
* @author hjm
* @date 2019/07/09
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private DataSourceTransactionManager transactionManager;
@Override
@Transactional
public void save(User user) {
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 {
// execute your business logic here
//db operation
} catch (Exception ex) {
transactionManager.rollback(status);
throw ex;
}
}
}
解释上述原因:
Spring框架的事务处理代码默认地 只 在抛出运行时和unchecked exceptions时才标识事务回滚。 也就是说,当抛出个RuntimeException 或其子类的实例时,(Errors 也一样 – 默认地 – 标识事务回滚。)从事务方法中抛出的Checked exceptions将 不
1、让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)
2、让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
3、不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)
注意: 如果异常被try{…}catch{…}了,事务就不回滚了,如果想让事务回滚必须再往外抛try{…}catch{throw Exception}。
下面再说一下异常的继承体系(拓展的内容):
记住:出现异常,不要紧张,把异常的简单类名,拷贝到API中去查或者问度娘,很强大的哦。
Java异常处理的五个关键字:try、catch、finally、throw、throws。后续再详细逐一介绍。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
hi,我是熵减,见字如面。 近日,阿里在继年初3月份的1+6+N的战略变革的基础上,对持续建设和运营8年的中台的调整终于落地了。 阿里对中台的这一举措,引发了外界对于中台战略是否还有意义的大量质疑和讨论。 甚至有人将中台战略称之为自欺欺人的一场骗局。 中台战略…