讲一些题外话,没兴趣的可直接跳过.
首先非常感谢并宣传一波常常被骂的狗血淋头却又觉得异常可爱的暗灭大人. 教会我的太多太多, 但最重要的也是和这篇文章有关联的就是让我明白该如何去思考问题, 定位问题, 解决问题.
首先介绍下背景, 这边做的是一对多(包括一对一)的私信功能,那么自然而然对应的就需要几个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 |

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

1137

被折叠的 条评论
为什么被折叠?



