暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

业务中死锁分析

godba 2025-04-10
109
背景:
日志报死锁问题。

分析:死锁原因是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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论