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条件
异步更新
- 优势
- 减小客户端等待时间
- 提升服务端的并发量
- 把并发操做转化为更简单的同步操做
- 缺点
- 服务端和客户端须要支持异步消息通知,由于异步操做的结果只能异步返回
- 须要使用消息队列和异步消息通知,若是没有现成框架支持,代码实现会更加复杂
- 不支持其余须要依赖更新结果的逻辑,除非全部逻辑都异步化
参考