事务方法中发送异步消息,且事务方法中和消息处理逻辑都更新同一表导致数据错乱-爱代码爱编程
事务方法中发送异步消息,且事务方法中和消息处理逻辑都更新同一表导致数据错乱
1.背景:
mysql数据库隔离级别:读已提交(非可重复读)
业务场景:活动审核通过后,更新活动状态(更新为报名开始)、活动场次状态(更新为报名开始),然后发送延时异步消息(在活动报名开始、报名结束、活动开始、活动结束各个时间节点投递消息)。消费者那里进行活动、活动场次各个环节的状态更新。
2.造成数据异常的现象:
审核通过后,活动场次表的活动报名开始时间应该更新为审核通过时间,状态应该更新为报名中;结果活动场次表数据没更新,状态也没有更新。
3.产生原因:
事务方法内更新了活动场次表,但是事务还没有结束,没有提交。此时消息已经发送出去,消费者查询到场次表活动开始时间未更新,判断为活动场次报名未开始。之后事务方法提交,再之后消费者提交更新把事务方法的更新覆盖掉了。由于消费者更新时把更新时间参数也带进去了,导致数据库更新时间也是一个脏数据。从数据库上看,完全看不出活动场次表的更新痕迹。大坑!
4.解决方法:
事务提交之后再发送异步消息