在使用数据库集群后,突然发现审批流的大部分节点无法提交。在研究报错定义扒取源码逻辑后,又参考运行环境,猜测是由于数据库集群导致。
1、了解了源码逻辑后发现:审批流Activiti在提交审批时,操作的act表有很多,快速的读写、读写。然而读写时会有数据的版本码,比如act表里,同一条审批的数据会有version字段的1、2、3......等数据去控制。提交审批时存进去的是版本3的数据,再业务处理后又去取存的数据,版本对的上,继续往下进行,不一致抛出异常。
2、针对于1的发现,什么情况会导致?在一瞬间就猜测,数据库集群开启的是读写分离,写到主机,读取都走从机。验证尝试切换一种模式后发现问题消失。
总结:数据库集群主从同步需要一定时间,再快也有时间。当开启读写分离后,审批流提交,把数据和版本号写入A库,这时还没来得及同步到B库。又去读取时,走的是B库,取出来的数据版本无法对应上,导致Activiti的校验被触发,抛出异常。