MVCC
多版本并发控制:
https://en.wikipedia.org/wiki/Multiversion_concurrency_control
中文的明显写得不太好理解:
引擎翻译的, 还不错.
MVCC使用时间戳(TS)和递增事务ID来实现事务一致性。
MVCC通过维护多个版本的对象,确保事务(T)从不等待读取数据库对象(P)。
每个版本的对象P都有读取时间戳(RTS)和写入时间戳(WTS),它允许特定事务Ti读取在事务的读取时间戳RTS(Ti)之前的对象的最新版本。
如果事务Ti想要写入对象P,并且还存在发生于同一对象的另一个事务Tk,则读取时间戳RTS(Ti)必须位于读取时间戳RTS(Tk)之前,即RTS(Ti)<Tk),对象写入操作(WTS)才能成功。
【需要澄清】, This seems to contradict the next paragraph, which states that a transaction is aborted if its read timestamp is earlier than the latest read timestamp on an object (June 2018)
如果存在其他未完成事务,且该事务具有较早的读取时间戳(RTS),则写入无法完成。
就像在商店排队一样,在你前面的人完成他们的结账之前,你是无法完成结账交易的。
>>说得很好, 道理都是很简单的
要重述;每个对象(P)都有一个时间戳(TS),但是,如果事务Ti要写入对象,并且事务的时间戳(TS)早于对象的当前读取时间戳(TS)(Ti)<RTS(P)),则事务将被中止并重新启动。
(这是因为后续事务已依赖于旧值。)
否则,Ti创建新版本的对象P并将新版本的读/写时间戳TS设置为事务TS←(Ti)的时间戳。
本系统的缺点是在数据库中存储多个版本对象的开销。
另一方面,从不阻止读取,这对主要涉及从数据库中读取值的工作负载很重要。
MVCC尤其擅长实现真正的快照隔离,而其他并发控制方法常常不能完全实现或以高性能成本实现这种隔离
论文下载:
https://sites.fas.harvard.edu/~cs265/papers/bernstein-1983.pdf
https://www.researchgate.net/profile/Abraham_Silberschatz/publication/221309584_Obtaining_Progressive_Protocols_for_a_Simple_Multiversion_Database_Model/links/0912f51373df7682d9000000/Obtaining-Progressive-Protocols-for-a-Simple-Multiversion-Database-Model.pdf