代码如下
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@Componentpublic 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); }}