mysql并发更新
常见方案
乐观锁
select * from tab1 where id = ?;
update tab1 set col1 = ? where id = ? and version = ?;
- 缺点
- 在高并发下可能更新失败,所以需要通过重试(select...,update...)来提高更新成功率
select * from tab1 where id = ? for update;
update tab1 set col1 = ? where id = ?;
- 注意
- select…for update会把数据给锁住,不过我们需要注意一些锁的级别,MySQL InnoDB默认行级锁。行级锁都是基于索引的,如果一条SQL语句用不到索引是不会使用行级锁的,会使用表级锁把整张表锁住,这点需要注意。
- 优点
- 缺点
- 可能导致其它相关的(包含该for update行内容)并发操作阻塞
update tab1 set col1 = col1-1 where col1>1
- 优点
- 缺点
- 无法获取更新前后col1字段的值
- 只适用于简单的where条件
异步更新
- 优点
- 减少客户端等待时间
- 提高服务端的并发量
- 把并发操作转化为更简单的同步操作
- 缺点
- 服务端和客户端需要支持异步消息通知,因为异步操作的结果只能异步返回
- 需要使用消息队列和异步消息通知,如果没有现成框架支持,代码实现会更加复杂
- 不支持其他需要依赖更新结果的逻辑,除非所有逻辑都异步化
参考