本着“实践是检验真理的唯一标准”的精神,如题,想模拟出读已提交隔离级别下可能出现的不可重复读问题,自己写了代码验证,但并没有出现预想中的数据不一致问题,各位看官可否帮看下是否有哪不妥?
两个事务方法,按先后调用,事务一执行过程中暂停,此时事务二执行完毕,事务一再次查询,结果与第一次查询并没有不同。
代码:
@Transactional(isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
public void transactionOne() {
//代码块1 开始
TestEntity entity = testDao.selectById(1);
int countAll = testDao.selectCount(null);
log.info("事务一:ID为1的数据首次查询name为:{},数据总条数为:{}", entity.getName(), countAll);
//代码块1 结束
try {
log.info("事务一:暂停10秒,请开启第二个事务!");
Thread.sleep(10000);
log.info("事务一:暂停10秒完成");
} catch (InterruptedException e) {
e.printStackTrace();
}
//位置1
entity = testDao.selectById(1);
log.info("事务一:ID为1的数据再次查询name为:{}", entity.getName());
log.info("事务一:再次查询数据记录条数为:{}", testDao.selectCount(null));
}
@Transactional(isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
public void transactionTwo() {
TestEntity entity = new TestEntity();
entity.setCode(4);
entity.setName("事务二添加的数据");
entity.setIndustryId(1);
testDao.insert(entity);
log.info("事务二:新加数据记录完成,数据ID为4");
entity = testDao.selectById(1);
entity.setName("事务二中设置的新name");
testDao.updateById(entity);
log.info("事务二:更新ID为1的数据name值完成");
}
执行结果:
事务一:ID为1的数据首次查询name为:初始值,数据总条数为:2
事务一:暂停10秒,请开启第二个事务!
事务二:新加数据记录完成,数据ID为4
事务二:更新ID为1的数据name值完成
事务一:暂停10秒完成
事务一:ID为1的数据再次查询name为:初始值 此两行有疑问!!!
事务一:再次查询数据记录条数为:2