java踩坑日常——事物内末尾发送MQ消息
今天发现订单状态推进有问题,大概百分之二的出错率。一路追查到数据库sql执行记录。才发现了问题。
订单更新逻辑如下:
1、更新订单
2、发送此订单的MQ消息
3、消费者读取此订单数据,生成(同步)履约单
4、更新此订单的履约同步状态
问题出在第四步,没有选择单字段更新,用mybatis的生成器生成mapper和接口后,更新时直接使用了3中读取的数据。
正常来讲,这样其实也没有问题,毕竟按照顺序执行的话,3读取的是1更新后的数据。
然后。事物实际在2之后彩扩提交生效修改数据库,就有可能出现2->3->1的执行顺序,此时1的更新失效。订单状态出错。