Spring的@Transactional事务无法处理thread线程的解决方案

http://www.cnblogs.com/lay2017/p/7273382.html

 

问题描述:

在Spring的web项目中,查询了多行数据,对这些数据遍历处理,并对每一条数据采取线程的方式去执行,方式如下:

复制代码
 1 new Thread(new Runnable() {
 2   @Override
 3   public void run() {
 4      try {
 5         processEachPlan(learn); // 处理逐条数据
 6      } catch (Exception e) {
 7         Logger.info("异常信息:" + e.toString());
 8      }
 9   }
10 }).start();
复制代码

问题在于run(){}方法中的processEachPlan(learn)不受声明式事务管理了,但是我的需求是让每一个processEachPlan(learn)都在各自的事务中管理,这样能够保证逐条处理的数据的完整性。

解决方案:

我的想法是能否自己控制事务,解决方式如下:

复制代码
 1 new Thread(new Runnable() {
 2   @Override
 3   public void run() {
 4     // spring无法处理thread的事务,声明式事务无效
 5     DefaultTransactionDefinition def = new DefaultTransactionDefinition();
 6      def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
 7      PlatformTransactionManager txManager = ContextLoader.getCurrentWebApplicationContext().getBean(PlatformTransactionManager.class);
 8      TransactionStatus status = txManager.getTransaction(def);
 9                     
10      try {
11         processEachPlan(learn);
12         txManager.commit(status); // 提交事务
13      } catch (Exception e) {
14         Logger.info("异常信息:" + e.toString());
15         txManager.rollback(status); // 回滚事务
16       }
17   }
18 }).start();
复制代码

如上代码中,大概意思就是获取了spring配置中的bean,以及相关定义来开启事务,processEachPlan(learn)如果执行成功,那么commit()提交事务,如果出现异常,那么rollback()回滚。在我的项目中,测试是成功的。

Leave a Reply

Your email address will not be published. Required fields are marked *