知识卡片
乐观锁CAS的原子三件套
内容
数据库乐观锁(CAS)的关键不是记版本号本身,而是把”比较版本号、加一、更新字段”放进同一条update语句原子完成:update T set balance=新值,version=version+1 where id=x and version=旧值。分开做则中间存在被插入修改的窗口,退化为[[道术是问题与答案的关系]]式假解决。局限是只保证单表单记录原子性,跨表需分布式锁。
参考来源
- 位置:第6章《数据库》6.4.2节「悲观锁和乐观锁」(源文件:_epub-src/text/part0028.html)
- 结论依据:原文明确说明数据库乐观锁的实现关键是利用update语句的原子性做CAS——version的比较、加1、balance的更新这三件事情都在一条update语句里完成,直接支持卡片对乐观锁三件套须放进同一条update语句原子完成的论述。
- 原始内容:"在实现层面,就是利用update语句的原子性实现了CAS,当且仅当version=v1时,才能把balance更新成功。在更新balance的同时,version也必须加1。version的比较、version的加1、balance的更新,这三件事情都是在一条update语句里面完成的,这是这个事情的关键所在!"