文章目录
1 数据库的事务隔离级别有那些
1.1 事务四大特性
在说事务的隔离级别之前,让我们先了解一下数据库事务的四大特性(ACID)分别是什么:
A.原子性(Atomicity):原子性指数据库事务是一个不可分割的操作,要么全部执行成功,要么全部执行失败。在mysql中原子性是通过undolog实现。
C.一致性(Consistency):官网上事务一致性的概念为:事务必须使数据库从一个一致性状态转换到另外一个一致性状态,也就是说事务按照预期生效,数据的状态是预期的状态。数据库的一致性由原子性、隔离性和持久性维护。
I.隔离性(Isolation):在多个用户并发访问数据库时,数据库要为每一个用户开启一个事务,多个并发事务之间是隔离的。mysql通过mvcc和锁实现隔离性。
D.持久化(Durability):一旦一个事务被提交,事务对数据库中的数据的修改是持久性的。mysql通过redo log实现持久化。
1.2 隔离级别
针对数据库事务的隔离性有四种隔离级别,分别是:读未提交、读已提交、可重复读和串行化,对于不同隔离级别,数据库产生的问题如下:
隔离级别 | 脏读 | 不可复读 | 幻读 |
---|---|---|---|
READ-UNCOMMITED | √ | √ | √ |
READ-COMMITED | x | √ | √ |
REPEATABLE-READ | x | x | √ |
SERIALIZABLE | x | x | x |
mysql的默认隔离级别是可重复读,会产生幻读问题。
下面对脏读、不可复读和幻读进行解释一下:
- 脏读:事务能够读取到未提交的数据,这种情况为脏读。
- 不可复读:当一个事务在执行过程中,数据被另外一个事务修改,造成本次事务多次读取的信息不一致,这种情况为不可复读。
- 幻读:当事务A读取某一个范围的数据时,另外一个事务B在这个范围内插入新的记录并提交,事务A再次读取该范围的数据时,就会产生幻读。
2.MVCC的实现原理
MVCC全是为Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发访问数据库的控制方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。
MVCC在MySQL的InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。
在了解MVCC的实现是,让我们先了解一下当前读和快照读: