Junit单元测试多线程中子线程无法查询主线程的数据

目录

1.表现

2.原因

3.解决方法

1.表现

在单元测试中,开启了事务,并且在主线程中进行数据库操作,然而开了多线程处理后,子线程无法获取主线程的数据。

举个例子,在主线程中insert了几条记录,然后在子线程中查询会发现查询不到

//代码只是随手例子,并不能真实执行
pubic void mainThread(){
//主线程插入数据
insert(id);
//子线程删除
new Thread(() -> deleteById(id)).start();
//期望结果是子线程成功删除,但会发现实际上没有删除
Assert.assertEquals(0, queryById(id));
}

2.原因

直接原因是由于开启了事务,所以在执行单元测试时,事务并不会提交,只有单元测试结束才会一起回滚,同时单元测试中,线程之间是事务隔离的。

这就导致了在子线程中,读取不到主线程未提交的事务。

3.解决方法

解决方法有两个:

  • 参考官网,在子线程处理前提交事务,优点是影响范围很小,缺点是事务无法回滚
  • 数据库的事务级别改成读未提交,优点是事务可以回滚且不需要重复操作,缺点就大得离谱了[doge]

第一种方法参见官网:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值