
分析:死锁原因是3个session 同时争用一条数据。数据行号(606902,55) 表: t_XXXXX_user_notify。和数据库日志中 对象 号(17943)对应。

跟开发了解情况:
“是抢单业务,抢单发到用户后就有消息弹框提示。屏幕下方就有消息弹窗和提示音,不处理的话会按照规则隔断时间提醒。问题应该是多个用户同时关闭多个消息弹窗(设置已读)造成的。”

解读:
1 幂等性操作,多进程同时设置消息已读。
2 自动提醒,触发式提醒,其并发量是可控的,一般提醒的次数是有限的。
基于这两点其逻辑还是比较简单, 多次操作合并成1次操作。
建议:
方案1 中间嵌套消息中间件.客户端把请求数据发送到消息中间件中只要是1条消息那么合并成1次操作。 针对1个消息id只有1次操作。把死锁概率降低到最低。
方案2 可以采用跳锁操作。
大致
update taba set colunm =? where id in ( select id from taba where id =? for update skip locked);
可以理解为当老师喊你去擦黑板时, 你发现黑板已经有同学在擦了,而且马上就要干完了。
文章转载自godba,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。





