目录
1.表现
在单元测试中,开启了事务,并且在主线程中进行数据库操作,然而开了多线程处理后,子线程无法获取主线程的数据。
举个例子,在主线程中insert了几条记录,然后在子线程中查询会发现查询不到
//代码只是随手例子,并不能真实执行
pubic void mainThread(){
//主线程插入数据
insert(id);
//子线程删除
new Thread(() -> deleteById(id)).start();
//期望结果是子线程成功删除,但会发现实际上没有删除
Assert.assertEquals(0, queryById(id));
}
2.原因
直接原因是由于开启了事务,所以在执行单元测试时,事务并不会提交,只有单元测试结束才会一起回滚,同时单元测试中,线程之间是事务隔离的。
这就导致了在子线程中,读取不到主线程未提交的事务。
3.解决方法
解决方法有两个:
- 参考官网,在子线程处理前提交事务,优点是影响范围很小,缺点是事务无法回滚
- 数据库的事务级别改成读未提交,优点是事务可以回滚且不需要重复操作,缺点就大得离谱了[doge]
第一种方法参见官网: