都知道事务传播机制有七种,但是都是 面试背的,实际应用中从来没注意过。这次同事写的时候没注意就给我留了个坑。
有这样一个情况,事务A里边嵌套了事务B,在事务的传播机制上,同事写成了PROPAGATION_REQUIRES_NEW
,我当时也没注意,结果测试的时候出了个bug,查了好久。
起因是这样:事务A里边会对一个数据记录data是否存在进行判断,不存在就新增,事务B里边也做了一次对数据记录data是否存在的判断,不存在就新增。
代码进入事务A,发现数据库没有,新增data,接着进入事务B, 事务A挂起,事务B看不到事务A未提交的数据,发现data不存在,进行写入,事务B提交,事务A提交的时候发生唯一索引冲突,回滚,但是事务B没有回滚。因为A和B是两个独立的事务。
实际上在这种情况下,我们需要保证两个事务的上下文互相可见,所以需要变成同一个事务,传播机制用PROPAGATION_REQUIRED
就可以了,这样要么全部失败要么全部成功。
而spring里边事务注解默认的传播机制就是这个级别,