在线程池+batchSave,事物失效

由于每次上传execl数据十万条,一次批量太慢
用的是线程池+batchSave,但是事物失效,怎么办
@Before(Tx.class)
public void test1(List<TaxPayExcel> resultList){
    long begin=System.currentTimeMillis();
    ExecutorService executorService = Executors.newCachedThreadPool();
    for(int j=0;j<10;j++){
        int finalJ = j;
        executorService.execute(()->{
            List<TaxPayExcel> tempList=new ArrayList<>();
            for(int i = finalJ *3000; i<(finalJ+1)*3000; i++){
                tempList.add(resultList.get(i));
            }
            Db.batchSave(tempList,tempList.size());
        });
    }
    executorService.shutdown();
    try {
        executorService.awaitTermination(1, TimeUnit.DAYS);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    long end=System.currentTimeMillis();
    System.out.println(end-begin);
    throw new RuntimeException("");
}


评论区

杜福忠

2019-05-29 11:18

Db事务就是基于线程设计的。 多线程自然就不支持了。
不过可以扩展一下。推荐使用 Db.tx(xx)控制更精细些。
就是每个线程里面都使用 Db.tx(xx),然后在 return 之前把结果(true或false)放入 外层的
“总结果集”中,并等待所有的线程执行完毕后,看 总结果集 里面有false值没, 有的话, 就 return false;这样就全部失败, 或全部成功。

杜福忠

2019-05-29 11:25

@nani https://www.jfinal.com/doc/5-7 注意:MySql数据库表必须设置为InnoDB引擎时才支持事务,MyISAM并不支持事务。

热门反馈

扫码入社