Skip to content

Latest commit

 

History

History
41 lines (34 loc) · 1.85 KB

008mvcc.md

File metadata and controls

41 lines (34 loc) · 1.85 KB

mvcc 多版本并发控制

数据库领域的并发控制有3种:

  • 悲观并发控制
  • 乐观并发控制
  • 多版本并发控制

在关系数据库中:
悲观并发控制

  • 悲观锁 pessimistic concurrency control. ppc
  • 用于数据竞争激烈的环境
  • 用锁来保证事务的执行,因为有锁的保护,冲突的事务只能依次执行,也就没有事务回滚
  • 事务回滚的成本比锁高

乐观并发控制

  • 乐观锁
  • 用于数据争用不大,冲突较少的环境
  • 在提交数据更新之前,检查一下有没有其他事务修改了本次事务关联的数据,如果有,表是有冲突,就回滚
  • 总体来说 偶尔的回滚成本小于锁成本
  • 这种并发控制比其他方式有更高的吞吐量

多版本并发控制

  • multiversion concurrency control, mvcc
  • mvcc的每个写操作都会创建一个新的版本
  • 读会从最适合的版本返回结果,要么是最新版本,要么是指定版本
  • 这样关注点从读写冲突变为了如何管理和高效地选取数据版本

为什么etcd选择mvcc

  • etcd的定位是分布式,一致的 kv存储
  • 使用场景是 读多写少
  • v2 是纯内存数据库,有一个全局锁来解决问题,但还有不好的地方:
    • 锁的颗粒度不好控制,全局锁,每次都会把整个数据库锁住
    • 读锁 写锁会相互阻塞
    • 如果一个事务很长,使用锁时,这个事务执行期间,整个数据库都被锁了,其他操作全部阻塞,性能影响能大
  • mvcc 可以在写执行的通知,让读操作读老版本数据,这样读写完全不需要锁。这是串行化读,也可以指定etcd按线性化模式工作
  • mvcc保证了 读操作可以读比这个版本号新的数据,而不是新的数据
  • mvcc 适合 读多写少的场景

第三部分 探索etcd内部细节,暂时可以不用看。