事务隔离特性
就是数据的可见性和不可见性。
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必须要执行。