MYSQL数据库事务隔离级别

事务隔离特性
就是数据的可见性和不可见性。

SQL 标准的事务隔离级别包括:
读未提交(read uncommitted)
读提交(read committed)
可重复读(repeatable read)
串行化(serializable )

读未提交(read uncommitted):一个事务的修改,还没提交,就可以被其他事务看到。
读提交(read committed):一个事务的修改,提交之后,才可以被其他事务看到。
可重复读(repeatable read):一个事务启动后,在这个事务执行过程中,数据总是保持一致的。
串行化(serializable ):事务排队执行,后来的事务要等前面的事务执行完才能执行。

隔离性举例,按照上面的理论,我们看看两个事务A和事务B,同时执行,不同隔离级别,事务A读取的V1、V2、V3的值分别是多少。

------------------------------------------
事务A			|	事务B
启动事务查询值为1	|	启动事务
-----------		|	-----------
-----------		|	查询值为1
-----------		|	将1改为2
查询获取值V1		|	-----------
			|	提交事务B
查询获取值V2		|	
提交事务A		|	
查询获取值V3		|	
			|	
------------------------------------------

不同隔离级别去读数据结果:

“读未提交”: V1=2,V2=2,V3=2
“读提交”: V1=1,V2=2,V3=2
“可重复读”: V1=1,V2=1,V3=2
“串行化”: V1=1,V2=1,V3=2

MySQL事务的实现使用了多版本并发控制(MVCC),也就是多个事务同时更新一条数据,此时数据库会按照先后顺序的依赖,创建出这条数据的多个版本。

read-view-A	read-view-B	read-view-C	|read-view-D
	↓	↓		↓		|  ↓
-----------------------------------------------------------
	↓	↓		↓		|  ↓
[将2改为1]←  [将3改为2]	←  [将4改为3]	←	  [当前值4]	

数据的版本依赖分别是A->B->C->D,也就是A依赖B,B依赖C,C依赖D,如果A要获得值1,那么BC必须要执行。