批量新增品牌数据, 然后新增完之后,在事务方法里开启线程执行所有品牌数量查询
代码如下, 只展示相关代码
@Transactional(rollbackFor = Exception.class)
@Override
public void add(BrandEntity brand) {
// baseMapper.insert(brand);
List<BrandEntity> list = new ArrayList();
for (int i=0;i<10;i++){
list.add(brand);
}
brandDao.insertBatch(list);
Runnable runnable = new Runnable() {
@Override
public void run() {
Integer threadCount = brandDao.selectCount(null);
System.out.println("子线程==============================");
System.out.println("子线程==============================");
System.out.println("子线程==============================");
System.out.println("子线程==============================");
System.out.println("子线程品牌数量:"+threadCount);
System.out.println("子线程==============================");
System.out.println("子线程==============================");
System.out.println("子线程==============================");
System.out.println("子线程==============================");
}
};
Thread child = new Thread(runnable, "子线程");
child.start();
Integer mainCount = brandDao.selectCount(null);
System.out.println("主线程>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
System.out.println("主线程>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
System.out.println("主线程>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
System.out.println("主线程>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
System.out.println("主线程品牌数量:"+mainCount);
System.out.println("主线程>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
System.out.println("主线程>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
System.out.println("主线程>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
System.out.println("主线程>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
try {
//让主线程,休眠, 事务未提交, 证明子线程读取的数据是事务未提交前的数据
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
第一次插入10个品牌数据 , 控制台打印如下
2021-09-25 14:55:01.160 DEBUG 9124 --- [io-10001-exec-7] c.a.g.product.dao.BrandDao.selectCount : ==> Preparing: SELECT COUNT( 1 ) FROM pms_brand
2021-09-25 14:55:01.160 DEBUG 9124 --- [io-10001-exec-7] c.a.g.product.dao.BrandDao.selectCount : ==> Parameters:
2021-09-25 14:55:01.161 DEBUG 9124 --- [io-10001-exec-7] c.a.g.product.dao.BrandDao.selectCount : <== Total: 1
2021-09-25 14:55:01.161 DEBUG 9124 --- [ 子线程] c.a.g.product.dao.BrandDao.selectCount : ==> Preparing: SELECT COUNT( 1 ) FROM pms_brand
主线程>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
主线程>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
主线程>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
主线程>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
主线程品牌数量:25
主线程>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
主线程>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
主线程>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
主线程>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2021-09-25 14:55:01.161 DEBUG 9124 --- [ 子线程] c.a.g.product.dao.BrandDao.selectCount : ==> Parameters:
2021-09-25 14:55:01.163 DEBUG 9124 --- [ 子线程] c.a.g.product.dao.BrandDao.selectCount : <== Total: 1
子线程==============================
子线程==============================
子线程==============================
子线程==============================
子线程品牌数量:15
子线程==============================
子线程==============================
子线程==============================
子线程==============================
第二次插入10个品牌数据 , 控制台打印如下
2021-09-25 14:55:07.328 DEBUG 9124 --- [io-10001-exec-8] c.a.g.product.dao.BrandDao.selectCount : ==> Preparing: SELECT COUNT( 1 ) FROM pms_brand
2021-09-25 14:55:07.328 DEBUG 9124 --- [io-10001-exec-8] c.a.g.product.dao.BrandDao.selectCount : ==> Parameters:
2021-09-25 14:55:07.329 DEBUG 9124 --- [ 子线程] c.a.g.product.dao.BrandDao.selectCount : ==> Preparing: SELECT COUNT( 1 ) FROM pms_brand
2021-09-25 14:55:07.329 DEBUG 9124 --- [ 子线程] c.a.g.product.dao.BrandDao.selectCount : ==> Parameters:
2021-09-25 14:55:07.329 DEBUG 9124 --- [io-10001-exec-8] c.a.g.product.dao.BrandDao.selectCount : <== Total: 1
主线程>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
主线程>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
主线程>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
主线程>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
主线程品牌数量:35
主线程>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
主线程>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
主线程>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
主线程>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2021-09-25 14:55:07.329 DEBUG 9124 --- [ 子线程] c.a.g.product.dao.BrandDao.selectCount : <== Total: 1
子线程==============================
子线程==============================
子线程==============================
子线程==============================
子线程品牌数量:25
子线程==============================
子线程==============================
子线程==============================
子线程==============================
从控制打印可以发现: 子线程 和 主线程所读取的数据不一致
原因就是: 子线程在service事务方法里面读取了事务未提交前的数据, 应该在service事务方法执行完之后再开启子线程读取数据库的数据