mysql四种隔离级别以及原理

事务4大特性:

原子性: undolog日志来保证, 记录了要回滚的日志信息, 事务回滚时撤销已经执行的sql.
一致性:由其它3大特性来保证。
隔离性: MVCC来保证, 多版本并发控制。
持久性:由redolog来保证, mysql修改数据会在redolog中记录一份日志数据, 就算没有保存成功, 只要日志保存成功, 数据就不会丢失,
mysql崩溃恢复功臣-redo log.


事务并发问题

修改丢失:两个事务同时修改一个数据, 发生了修改覆盖问题。
脏读: 事务A读取到了事务B中未提交的数据, 当事务B回滚的时候, 事务A读到的都是脏数据。
不可重复读:事务A多次读取同一数据, 但是每次读取的值都不同, 这是因为事务B多次对数据进行更新和修改.
幻读:事务A在操作过程中, 表多次新增和删除, 并且新增和删除的数据会最终影响到事务A操作结果。


mysql隔离级别:

数据库事务隔离级别有4个, 由低到高依次为:
RU->Read Uncommitted(读未提交), 脏读, 不可重复读、幻读都存在
所有读不加锁, 读到的数据都是最新数据, 性能最好
所有写加锁, 写完释放

RC->Read Commited(读已提交) :解决了脏读, 存在不可重复读, 幻读问题。
使用mvcc技术, 每行加入隐藏字段(DB_TRX_ID:修改改行的最后一个事务ID,DB_ROLL_PTR:指向当前行的undo log, DB_row_id:当前行标识, DELETE_BIT:删除标志), 它实现了不加锁的读操作。
写操作:加行级锁, 事务开始后, 会在undo日志中写入修改记录, 数据行中隐藏列DATA_POLL_PTR存储指向该行的undo记录的日志。
读操作:不加锁, 读取时, 如果该行被其他事务锁定, 则顺着隐藏列DATA_POLL_PTR指针, 找到上一个有效的历史记录(有效记录:该记录对当前事务可见,且DELETE_BIT=0)

RR->Repeatable Read(可重复读):解决了脏读, 不可重复读, 存在幻读。
适用mvcc技术实现不加锁的读操作

S->Serializable(串行化): 全部解决, 但是并发效率不高。

以上读已提交和可重复读操作基本相同, 区别在于,行记录对当前事务的可见性, 读已提交级别对数据可见性是该数据最新记录,
可重复读基本对数据可见性是事务开始时, 该数据的记录。


什么是MVCC?
多版本并发控制。
mysql四种隔离级别以及原理_第1张图片
mysql四种隔离级别以及原理_第2张图片
只有在读已提交(不可重复读) 和可重复读情况下才会有mvcc


mysql默认隔离级别是可重复读。
mysql四种隔离级别以及原理_第3张图片
可重复读每次 都用的第一次读的时候创建的readview, 之后每次都是复用这次的readview
读已提交事务每次查询的开始都会生成一个独立的readview。
可重复读的性能肯定是要比不可重复读性能更高。
通过版本链+readview来实现mvcc。

你可能感兴趣的:(mysql,mysql,数据库)