记因并发事物引起死锁后所展开的问题定位及解决过程

本文讲述了在并发环境下,由于特定操作顺序导致的数据库死锁问题。在发送私信功能中,两个并发事务因争夺同一资源的S锁和X锁产生死锁。通过对死锁原理的理解和分析,最终定位到问题代码并提出三种解决方案:缩小事务粒度、强制线程同步以及优化代码。最终选择通过优化代码,异步处理更新操作,成功避免死锁并保持了操作的原子性。

讲一些题外话,没兴趣的可直接跳过.

首先非常感谢并宣传一波常常被骂的狗血淋头却又觉得异常可爱的暗灭大人.   教会我的太多太多, 但最重要的也是和这篇文章有关联的就是让我明白该如何去思考问题, 定位问题, 解决问题.


首先介绍下背景,  这边做的是一对多(包括一对一)的私信功能,那么自然而然对应的就需要几个api其中包括

1.发送私信

2.略略略


表结构如下:


groups表 

用于存储用户组信息, 用户组是由两个或多个用户组成的

COLUMN    TYPE REQURIED    COMMENT
id Bigint true 自增id
code Varchar true

组员id正序排序特

殊符号分割后加密

latest_message_id Bigint true

发送给当

前所有组员的

最新消息id

       
       
       
       

user_group_relations表

因为一个用户可能有多个组所以使用一张表来存储用户与组的关系

COLUMN    TYPE REQURIED    COMMENT
id BigInt true 自增id
user_id BigInt true

用户id

unread_message_counts Integer true

对应group中

未读消息总数

group_id BigInt  true groupId
       
       
       

messages表

用于保存私信

COLUMN    TYPE REQURIED    COMMENT
id BigInt true 自增id
sender_id BigInt true

私信发送方id

content Varchar true

私信内容

group_id BigInt  true

发送给用户组中成员

的组id

       
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值