今天在处理一个问题时始终都没有头绪,主要场景是自己的方法中最后需要调用别人的方法进行回调,但是又同时处在一个大事务中,主要我做了以下场景来模拟

数据库表结构:

测试代码:

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 结果:

我们可以得到虽然事务没有提交但是同一会话查询时依然是修改后的值,但是此时如果为多线程下,别的线程将不会读取到提交事物之前的结果,这就是数据库的隔离性问题,此时事务没有提交,数据库结果未改变

当然,只有当程序正常运行结束之后,事务才会提交,数据库才会改变:

Edited on Views times