mybatis-plus icon indicating copy to clipboard operation
mybatis-plus copied to clipboard

同类中调用saveBatch批处理失效

Open shin8085 opened this issue 2 years ago • 1 comments

当前使用版本(必填,否则不予处理)

Mybatis-plus:3.5.1 SQL Server 2019:15.0.4198.2

该问题是如何引起的?(确定最新版也有问题再提!!!)

我在一个A类中继承了ServiceImpl类,然后在A类中直接调用saveBatch发现效率非常低并且事务并没有生效,但是但我在B类中继承ServiceImpl后,在A类中调用b.saveBatch发现效率快了近十倍! 应该是同类中调用aop失效导致的,如果是这样的话岂不是只能在Controller层调用?或者单独再写一个service?

重现步骤(如果有就写完整)

class DataSyncApplicationTests extends ServiceImpl<DataMapper,Data> {
    @Test
    void contextLoads() throws Exception {
        MybatisPlusConfig.setTableIndex("001");
        StopWatch stopWatch=new StopWatch();
        List<Data> list=new ArrayList<>();
        for(int i=0;i<50000;i++){
            Data data=new Data();
            data.setId("test:"+i);
            data.setRemark("new");
            data.setResult("new");
            data.setClueId("nddd");
            data.setOwnerName("ffff");
            data.setAudioUrl("fffff");
            list.add(data);
        }
        stopWatch.start();
        saveBatch(list);
        stopWatch.stop();
        System.out.println(stopWatch.getLastTaskTimeMillis());
    }
}
2022-03-11 09:26:46.940  WARN 2208 --- [           main] b.xxx.xxxxxxx.DataSyncApplicationTests  : SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@60b5e80d] Transaction not enabled
42091
class DataSyncApplicationTests extends ServiceImpl<DataMapper,Data> {
    @Resource
    Bclass bclass;

    @Test
    void contextLoads() throws Exception {
        MybatisPlusConfig.setTableIndex("001");
        StopWatch stopWatch=new StopWatch();
        List<Data> list=new ArrayList<>();
        for(int i=0;i<50000;i++){
            Data date=new Data();
            date.setId("test:"+i);
            date.setRemark("new");
            date.setResult("new");
            date.setClueId("nddd");
            date.setOwnerName("ffff");
            date.setAudioUrl("fffff");
            list.add(date);
        }
        stopWatch.start();
        bclass.saveBatch(list);
        stopWatch.stop();
        System.out.println(stopWatch.getLastTaskTimeMillis());
    }
}
4930

报错信息

shin8085 avatar Mar 11 '22 01:03 shin8085

我在一个A类中继承了ServiceImpl类,然后在A类中直接调用saveBatch发现效率非常低并且事务并没有生效

我猜测是因为在 A 类中直接调用 saveBatch 方法,没有经过 AOP ,所以 saveBatch 的 @Transaction 注解没有生效,可以在 contextLoads() 方法上加上 @Transaction 注解试试看。

lukelongcn avatar May 17 '22 08:05 lukelongcn