mysql并发更新
Posted 逆风的方向更适合飞翔
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql并发更新相关的知识,希望对你有一定的参考价值。
mysql并发更新
常见方案
乐观锁
select * from tab1 where id = ?;
update tab1 set col1 = ? where id = ? and version = ?;
- 缺点
- 在高并发下可能更新失败,所以需要通过重试(select...,update...)来提高更新成功率
读取锁定MySQL 8.0 Reference Manual / ... / Locking Reads
select * from tab1 where id = ? for update;
update tab1 set col1 = ? where id = ?;
- 优点
- 无需重试
- 缺点
- 可能导致其它相关的(包含该for update行内容)并发操作阻塞
条件更新MySQL 8.0 Reference Manual / ... / UPDATE Syntax
update tab1 set col1 = col1-1 where col1>1
- 优点
- 简单,一条语句即可实现
- 无需重试
- 缺点
- 无法获取更新前后col1字段的值
- 只适用于简单的where条件
异步更新
- 优点
- 减少客户端等待时间
- 提高服务端的并发量
- 把并发操作转化为更简单的同步操作
- 缺点
- 服务端和客户端需要支持异步消息通知,因为异步操作的结果只能异步返回
- 需要使用消息队列和异步消息通知,如果没有现成框架支持,代码实现会更加复杂
- 不支持其他需要依赖更新结果的逻辑,除非所有逻辑都异步化
以上是关于mysql并发更新的主要内容,如果未能解决你的问题,请参考以下文章
Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题