最近在做一个saas项目,该项目用的是springboot+springdata,持久数据层用的是mogoDB。
因为mogoDB4.0新增了多文档事务支持,再加上项目的业务需求,用mogoDB确实是个不错的选择,但是因为mogoDB的事务功能还不够成熟,采用的是全局一致性事务控制,也就是因为这个全局事务控制的特性,在这个项目上引发了非常严重的问题。
我先解释下什么是全局一致性把。
在mogoDB进入了一个事务中的时候,mogoDB会把事务中的数据操作(sql操作)涉及到的数据库(你没有听错,就是整个库)形成一个快照(就是记录这个事务开始时整个库的数据),所以其他事务在这个库中增删改的数据这个事务无法读到。
这会引发什么问题?
当我在含有@Transactional注解的业务方法serviceA()去调用另一个业务类中(注意是另一个类,因为@Tanscational注解的特性,不同类处在不同的事务中)含有@Transactional的业务方法serviceB(),而两个serviceA()和serviceB()都修改了同一条数据C(方法A的修改在方法B之前),那么此时mogoDB会报WriteConflict 写冲突的异常。因为serviceB()的事务读取不到serviceA()事务中修改的数据。就算把serviceA()中修改C的操作放在执行serviceB()后面,等serviceB()的事务提交了再在serviceA()里修改C,还是会报Wri