1.事务问题
spring项目中,如果配置了通用事务,则在方法上单独加上@Transational注解,可能会造
成回滚失效等一些问题;比如:通用配置事务的代码如下:
@Configuration
public class TxConfigBeanName {
@Autowired
private DataSourceTransactionManager transactionManager;
// 创建事务通知
@Bean(name = "txAdvice")
public TransactionInterceptor getAdvisor() throws Exception {
Properties properties = new Properties();
properties.setProperty("get*", "PROPAGATION_REQUIRED,-Exception");
properties.setProperty("query*", "PROPAGATION_REQUIRED,-Exception");
properties.setProperty("add*", "PROPAGATION_REQUIRED,-Exception");
properties.setProperty("save*", "PROPAGATION_REQUIRED,-Exception");
properties.setProperty("update*", "PROPAGATION_REQUIRED,-Exception");
properties.setProperty("remove*", "PROPAGATION_REQUIRED,-Exception");
properties.setProperty("delete*", "PROPAGATION_REQUIRED,-Exception");
properties.setProperty("logicDelete*", "PROPAGATION_REQUIRED,-Exception");
TransactionInterceptor tsi = new TransactionInterceptor(transactionManager,properties);
return tsi;
}
@Bean
public BeanNameAutoProxyCreator txProxy() {
BeanNameAutoProxyCreator creator = new BeanNameAutoProxyCreator();
creator.setInterceptorNames("txAdvice");
creator.setBeanNames("*Service", "*ServiceImpl");
creator.setProxyTargetClass(true);
return creator;
}
}
由上述看出 save开头的方法都有Required级别的事务,给下面的方法添加自己的事务:
@Override
@Transactional(propagation = Propagation.NESTED)
public void saveDoSomeOperate(Map<String, Object> params) throws BusinessException {
//do something
}
调用saveDoSomeOperate代码
try{
xxxService.saveDoSomeOperate(map);
}catch(Exception e){
log.error("系统错误", e);
}
如果saveDoSomeOperate方法报错,按照NESTED事务传播特性,外层事务应该不会回
滚,但是这里实际情况外层事务会回滚。
如果将NESTED注解的方法名改成 doSomeOperate,内层方法出现异常,只会自己回
滚,外层调用方数据不会回滚,改造如下:
@Override
@Transactional(propagation = Propagation.NESTED)
public void doSomeOperate(Map<String, Object> params) throws BusinessException {
//do something
}