网站建设风险是什么意思,定制app开发软件,wordpress 好慢哪,专门做金融的招聘网站作为第一篇对 MVCC 的学习材料#xff0c;以下内容翻译自 Wikipedia。 1. 什么是MVCC 1.1 基础概念 MVCC#xff0c;Multi-Version Concurrency Control#xff0c;多版本并发控制。MVCC 是一种并发控制的方法#xff0c;一般在数据库管理系统中#xff0c;实现对数据库的… 作为第一篇对 MVCC 的学习材料以下内容翻译自 Wikipedia。 1. 什么是MVCC 1.1 基础概念 MVCCMulti-Version Concurrency Control多版本并发控制。MVCC 是一种并发控制的方法一般在数据库管理系统中实现对数据库的并发访问在编程语言中实现事务内存。 如果有人从数据库中读数据的同时有另外的人写入数据有可能读数据的人会看到『半写』或者不一致的数据。有很多种方法来解决这个问题叫做并发控制方法。最简单的方法通过加锁让所有的读者等待写者工作完成但是这样效率会很差。MVCC 使用了一种不同的手段每个连接到数据库的读者在某个瞬间看到的是数据库的一个快照写者写操作造成的变化在写操作完成之前或者数据库事务提交之前对于其他的读者来说是不可见的。 当一个 MVCC 数据库需要更一个一条数据记录的时候它不会直接用新数据覆盖旧数据而是将旧数据标记为过时obsolete并在别处增加新版本的数据。这样就会有存储多个版本的数据但是只有一个是最新的。这种方式允许读者读取在他读之前已经存在的数据即使这些在读的过程中半路被别人修改、删除了也对先前正在读的用户没有影响。这种多版本的方式避免了填充删除操作在内存和磁盘存储结构造成的空洞的开销但是需要系统周期性整理sweep through以真实删除老的、过时的数据。对于面向文档的数据库Document-oriented database也即半结构化数据库来说这种方式允许系统将整个文档写到磁盘的一块连续区域上当需要更新的时候直接重写一个版本而不是对文档的某些比特位、分片切除或者维护一个链式的、非连续的数据库结构。 MVCC 提供了时点point in time一致性视图。MVCC 并发控制下的读事务一般使用时间戳或者事务 ID去标记当前读的数据库的状态版本读取这个版本的数据。读、写事务相互隔离不需要加锁。读写并存的时候写操作会根据目前数据库的状态创建一个新版本并发的读则依旧访问旧版本的数据。 一句话讲MVCC就是用 同一份数据临时保留多版本的方式 的方式实现并发控制。 这里留意到 MVCC 关键的两个点 在读写并发的过程中如何实现多版本在读写并发之后如何实现旧版本的删除毕竟很多时候只需要一份最新版的数据就够了 1.2 实现 MVCC 使用时间戳TS、递增的事务 IDT实现事务一致性。 MVCC 通过维护多版本数据保证一个读事务永远不会被阻塞。对象 P 维护有多个版本每个版本会有一个读时间戳Read TimeStamp, RTS和 写时间戳Write TimeStamp, WTS事务 Ti 读对象 P 的最新版本该版本早于事务 Ti 的读时间戳 RTS(Ti)。 事务 Ti 要对 P 执行写操作如果有其他事务 Tk 同时对 P 操作则 RTS(Ti必须要早于 RTS(Tk)即有 RTS(Ti) RTS(Tk)这样对 Ti 对 P 的写操作才能完成。一般地如果其他事务拥有 P 的一个更早的读时间戳的情况下写操作是不能完成的。打个比方就是在存储前面有一道线只有等你前面的人的完成了他们的事务你的修改事务才可以提交完成。 重复说一下每个对象 P 有一个时间戳 TS如果事务 Ti 想要对 P 执行写操作写要先读事务的读时间戳是 RTS(Ti)如果有其他事务拥有一个比较早的时间戳有 TS(P) RTS(Ti)这时事务 Ti 会退出并重新开始。否则事务 Ti 创建一个 P 的新版本并设置新版本 P 的时间戳似的 TS TS(Ti)。 MVCC 系统明显的缺点是会存储多个版本数据的冗余开销。但同时读操作永不会被阻塞这对那些以读操作为主的数据库来说非常重要。MVCC 实现了真的快照隔离snapshot isolation然后其他的并发控制方法要么是不完整的快照隔离方式要么需要较高的性能损耗。 Wikipedia 中的内容有点繁琐简单地上面的描述阐明了在同一数据版本下写操作的限制已经通过多版本实现快照隔离的优越性。 1.3 示例 TimeObject1Object20Foo by T0Bar by T01Hello by T1Time1的时候数据库的状态如上 T0 写 Object1 为 Foo写 Object2 为 Bar之后 T1 写 Object1 为 Hello保留 Object2 为原始值。 Object1 的新值将取代 Time0 时刻的旧值并提供给 T1提交之后的发生的所有事务。Object1的版本号为0的旧数据会被 GC 掉。 如果有一个长事务 T2在 T1之后对 Object1和 Object2 进行读操作同时并行地有事务 T3 做更新删除 Object2、增加 Object3Foo-Bar在 Time2 数据的状态如下所示 TimeObject1Object2Object30Foo by T0Bar by T01Hello by T12(delete)by T3Foo-Bar by T3在 Time2 Object2有一个新版本标记删除同时增加了新对象 Object3 。T2 和 T3 并发执行T2 看到的是数据在 Time2 且 T3提交前的版本这样 T2读到了 Object2Bar且Object1Hello。 以上就是 MVCC 在不加锁的情况下实现的快照隔离的读的原理。 1.4 历史 最早于1978年论文『Naming and Synchronization in a Decentralized Computer System』清晰地介绍了 MVCC这是公认关于 MVCC 最早的工作。 在1981年论文『Concurrency Control in Distributed Database System』介绍MVCC的一些细节。 目前支持 MVCC 的数据库包括 DB2、Oracle、Sybase、SQL Server、MySQL、PG 等所有主流数据库以及 HBase、Couchbase、Berkeley DB 等 NoSQL 数据库 参考 Wikipedia: Multiversion concurrency controlList of databases using MVCC转载于:https://www.cnblogs.com/YFYkuner/p/5178684.html