MVCC事务总结

Posted 数据库及存储技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MVCC事务总结相关的知识,希望对你有一定的参考价值。

NOSQL或者SQL中常常提到MVCC事务,MVCC 俨然成为SQL和NOSQL的标准配置。在最初的阶段主要使用二阶段锁,二阶段锁作为事务的最初机制,

其原理:

  • 读写都需要进行加锁

其缺点:

  • 性能底下,因为对同一个数据的读写操作都需要加锁互斥

逐渐,完全使用两阶段锁的事务方法逐慢慢被抛弃。



Snapshot Isolation(SI)


snapshot isolation的出现主要解决二阶段锁带来性能低下的问题,其原理:

  • 每一个数据都多个版本,读写能够并发进行

  • 每个事务相当于看到数据的一个快照

  • 写写不能并发,写写操作时需要加上行锁

  • 谁加行锁,谁可以顺利执行(采用了first win的原则),后面的写事务要么abort,要么等待前面的事务执行完成后再执行(Oracle 、SQL Server 和mysql等为代表)。


但是snapshot isolation带来一个大问题:write skew(写偏序)问题。通俗讲不能够达到串行化的隔离级别。


Write Skew


In a writeskew anomaly, twotransactions (T1 and T2) concurrently read an overlapping data set (e.g. valuesV1 and V2), concurrently make disjoint updates (e.g. T1 updates V1, T2 updatesV2), and finally concurrently commit, neither having seen the update performedby the other. Were the system serializable, such an anomaly would beimpossible, as either T1 or T2 would have to occur "first", and bevisible to the other. In contrast, snapshot isolation permits write skewanomalies.


通俗讲:写偏序(WriteSkew)是一致性约束下的异常现象,即两个并行事务都基于自己读到的数据集去覆盖另一部分数据集,在串行化情况下两个事务无论何种先后顺序,最终将达到一致状态,但SI隔离级别下无法实现。下图的黑白球常常被用来说明写偏序问题。



更通俗一点的例子:


数据库约束:A1+A2>0

A1,A2 实际值都为100

事务T1

If (read(A1) + read(A2) >= 200)

{

         Set A1 = A1 - 200

}

事务T2

If (read(A1)+ read(A2)>= 200)

{

         Set A2 = A2 - 200

}


事务T2 与事务T1 并发执行相同的语句,两个事务都会执行,执行成功后A1= -100 ,A2= -100 ,A1+A2=-200,显然是违背完整性约束。


Write Snapshot Isolation


为了解决write skew(写偏序)问题,出现serial Snapshot Isolation 理论,其实现方法有很多种,Write Snapshot Isolation作为serial Snapshot Isolation理论的典型代表解决write skew 问题。


基本的思想是:

  • 冲突检测发生在事务的运行阶段,而不是事务的提交阶段。


其原理是:

  • 增加读写冲突检测来解决WriteSkew 的问题。


其定义:

similarly to Snapshot Isolation,write Snapshot Isolation assigns unique start and commit timestamps to transactions and ensures that txni reads the latest version of data with committimestam & < ts(txni)

与SI 一样每个事务都有一个事务开始时间戳与事务结束时间戳。Write Snapshot Isolation 需要保证一个事务读的数据的最近一个版本的提交时间要早于事务的开始时间。


很抽象是不是,那我们换一种描述:如果两个读写事务txni,txnj同时满足下面两个条件,那么这两个事务不能同时提交成功:

  • RW-spatial overlap:txnj writeinto row rand txni read from row r

  • RW-temporal overlap: Ts(txni) < Tc(txnj) < Tc(txni) 


思路很简单,但是在分布式事务下实现起来很复杂。


Write Snapshot Isolation事务虽然解决writeskew 问题,还存在另外一个难以解决的问题:全序问题。

基于 Snapshot Isolation理论,每个事务都有两个事件:

* 事务的开始事件(时间)

* 事务的提交事件(时间)


所有的事件必须是全序的,即所有事件都有先后顺序。一般情况用时间轴表示事件的发生的前后关系,实现事件的全序。我们给事务分配一个事务的开始时间,一个事务的结束时间,这样在整个系统中,所有的事件都可以比较先后关系。


但是在分布式系统中,时间就变成一个非常大的难题,因为各个节点的时间可能有误差。而且根据侠义相对论,时空的事件并不存在一个始终如一的全序关系。如何解决?


待续。


..........................  END  ..........................


长按二维码关注


以上是关于MVCC事务总结的主要内容,如果未能解决你的问题,请参考以下文章

惊!MySQL MVCC原来这么简单

MySQL之MVCC总结理解

Mysql—4种隔离级别以及MVCC一致性视图的实现原理

INNODB MVCC

mysql事务-MVCC

MySQL事务并发问题和MVCC机制