今天在处理一个问题时始终都没有头绪,主要场景是自己的方法中最后需要调用别人的方法进行回调,但是又同时处在一个大事务中,主要我做了以下场景来模拟
数据库表结构:
测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| @SpringBootTest public class StudentMapperTest {
@Autowired private StudentDao studentDao;
@Test @Transactional(rollbackFor = Exception.class) @Rollback(false) void context01(){
LambdaUpdateWrapper<Student> updateWrapper0 = new LambdaUpdateWrapper<>(); updateWrapper0.eq(Student::getName,"张三");
List<Student> students = studentDao.selectList(updateWrapper0);
LambdaUpdateWrapper<Student> updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(Student::getName,"张三") .set(Student::getName,"张三改");
studentDao.update(Student.builder().build(), updateWrapper);
LambdaUpdateWrapper<Student> updateWrapper1 = new LambdaUpdateWrapper<>(); updateWrapper1.eq(Student::getName,"张三"); List<Student> students1 = studentDao.selectList(updateWrapper1);
LambdaUpdateWrapper<Student> updateWrapper2 = new LambdaUpdateWrapper<>(); updateWrapper2.eq(Student::getName,"张三改");
List<Student> students2 = studentDao.selectList(updateWrapper2);
} }
|
debug
结果:
我们可以得到虽然事务没有提交但是同一会话查询时依然是修改后的值,但是此时如果为多线程下,别的线程将不会读取到提交事物之前的结果,这就是数据库的隔离性问题,此时事务没有提交,数据库结果未改变
当然,只有当程序正常运行结束之后,事务才会提交,数据库才会改变: