1.事務(wù)問題
spring項目中掏湾,如果配置了通用事務(wù)攒发,則在方法上單獨(dú)加上@Transational注解有滑,可能會造
成回滾失效等一些問題贷岸;比如:通用配置事務(wù)的代碼如下:
@Configuration
public class TxConfigBeanName {
@Autowired
private DataSourceTransactionManager transactionManager;
// 創(chuàng)建事務(wù)通知
@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級別的事務(wù)壹士,給下面的方法添加自己的事務(wù):
@Override
@Transactional(propagation = Propagation.NESTED)
public void saveDoSomeOperate(Map<String, Object> params) throws BusinessException {
//do something
}
調(diào)用saveDoSomeOperate代碼
try{
xxxService.saveDoSomeOperate(map);
}catch(Exception e){
log.error("系統(tǒng)錯誤", e);
}
如果saveDoSomeOperate方法報錯,按照NESTED事務(wù)傳播特性偿警,外層事務(wù)應(yīng)該不會回
滾躏救,但是這里實際情況外層事務(wù)會回滾。
如果將NESTED注解的方法名改成 doSomeOperate户敬,內(nèi)層方法出現(xiàn)異常落剪,只會自己回
滾睁本,外層調(diào)用方數(shù)據(jù)不會回滾尿庐,改造如下:
@Override
@Transactional(propagation = Propagation.NESTED)
public void doSomeOperate(Map<String, Object> params) throws BusinessException {
//do something
}