记一次事务注解导致的数据同步问题

数据修改因为事务问题导致不一致问题

问题描述:

对外开发接口A中, 业务方法a()上添加@Transactional注解,然后在方法a()中先直接调用了操作了数据库的mapper,然后通过http回调用其他项目接口,这个回调接口会接着调用我的另外一个接口B,在接口B的业务方法b()中会查询方法a()中修改的数据结果,以此来验证需不需要往下走方法b()。
问题现象:数据确实修改了,但是方法b()中却验证不通过。

本地简单模拟代码,初始写法,方法添加@Transactional,数据库默认级别可重复读
记一次事务注解导致的数据同步问题

结论:

因为项目刚接手,前人代码也不规范,这确实是一个粗心导致的小问题,问题根本就是事务没有提交,导致了数据不一致问题

查询结果的输出为http调用的接口输出的,发现为修改删除标识
记一次事务注解导致的数据同步问题

原因:

方法a()上添加了@Transactional,方法没有走完,事务没有进行提交,数据修改对b()查询时自然是没有生效的。数据库隔离级别默认,可重复读,就导致了事务没提交前,所有的修改对其他事务都读取不到。

解决方法:

将操作数据库的操作单独拎出来进行操作,以及事务管理。也可以将数据库默认隔离级别更改为读未提交,当然不推荐。我个人习惯是将所有的数据库操作单独写一个service操作,不在任何业务代码中直接操作数据库。

修改后写法

记一次事务注解导致的数据同步问题
记一次事务注解导致的数据同步问题

总结

此次只是一个粗心导致的小问题,仅记录提醒自己,细节不可以忽略,规范更加重要