模型:
ClassCotroller, StudentController。25个学生为一个班级。
问题:
新增学生的处理逻辑:
@Transactional("rollback = Exception.class")
public boolean save(Student student) {
// step1: 登记学生
synchronized(this) {
// step2: 确定班级名称,必要时新建班级
// 班级的名称 = String.format("class_%03d", (学生数量-1)/25+1);
}
... // step 3
}
当第1个线程在step 3,第二个线程会进入step 2。
但因为线程1还没结束,事务没有提交。所以线程2获取到的学生数量就不包括线程1的学生,导致刚好到临界需要建班级时,会重复建班级。
解决办法:
把锁加在save函数上。
有时间再学习一下事务隔离级别: