数据库领域的并发控制有3种:
- 悲观并发控制
- 乐观并发控制
- 多版本并发控制
在关系数据库中:
悲观并发控制
- 悲观锁 pessimistic concurrency control. ppc
- 用于数据竞争激烈的环境
- 用锁来保证事务的执行,因为有锁的保护,冲突的事务只能依次执行,也就没有事务回滚
- 事务回滚的成本比锁高
乐观并发控制
- 乐观锁
- 用于数据争用不大,冲突较少的环境
- 在提交数据更新之前,检查一下有没有其他事务修改了本次事务关联的数据,如果有,表是有冲突,就回滚
- 总体来说 偶尔的回滚成本小于锁成本
- 这种并发控制比其他方式有更高的吞吐量
多版本并发控制
- multiversion concurrency control, mvcc
- mvcc的每个写操作都会创建一个新的版本
- 读会从最适合的版本返回结果,要么是最新版本,要么是指定版本
- 这样关注点从读写冲突变为了
如何管理和高效地选取数据版本
- etcd的定位是分布式,一致的 kv存储
- 使用场景是 读多写少
- v2 是纯内存数据库,有一个全局锁来解决问题,但还有不好的地方:
- 锁的颗粒度不好控制,全局锁,每次都会把整个数据库锁住
- 读锁 写锁会相互阻塞
- 如果一个事务很长,使用锁时,这个事务执行期间,整个数据库都被锁了,其他操作全部阻塞,性能影响能大
- mvcc 可以在写执行的通知,让读操作读老版本数据,这样读写完全不需要锁。这是串行化读,也可以指定etcd按线性化模式工作
- mvcc保证了 读操作可以读比这个版本号
更
新的数据,而不是最
新的数据 - mvcc 适合 读多写少的场景
第三部分 探索etcd内部细节,暂时可以不用看。