共计 1073 个字符,预计需要花费 3 分钟才能阅读完成。
代码如下
getThread().execute(new Runnable() { | |
@Override | |
public void run() {insert(); | |
} | |
}); |
insert(){ | |
insertTable1; | |
insertTable2;// 这是一个有惟一索引的表 | |
} |
想要的后果: 当惟一索引插入报错回滚事务
问题: 办法上加 @Transactional(rollbackFor = Exception.class)注解并未失效
起因:
1. 因为线程不属于 spring 托管,故线程不可能默认应用 spring 的事务, 也不能获取 spring 注入的 bean.
2. 在被 spring 申明式事务管理的办法内开启多线程,多线程内的办法不被事务管制。
解决方案:
既然 spring 无奈托管那就手动提交事务
代码如下:
getThread().execute(new Runnable() { | |
@Override | |
public void run() {DefaultTransactionDefinition def = new DefaultTransactionDefinition(); | |
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); | |
PlatformTransactionManager platformTransactionManager = SpringUtils.getBean(PlatformTransactionManager.class); | |
TransactionStatus status = platformTransactionManager.getTransaction(def); | |
insert();} | |
}); | |
//SpringUtils | |
@Component | |
public class SpringUtils implements ApplicationContextAware { | |
private static ApplicationContext applicationContext; | |
@Override | |
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;} | |
public static <T> T getBean(Class<T> tClass){return applicationContext.getBean(tClass); | |
} | |
} |
正文完