Mysql 知识点
Posted Lv Jianwei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql 知识点相关的知识,希望对你有一定的参考价值。
Isolation
隔离级别 | 脏读(Dirty Read) | 不可重复读(NonRepeatable Read) | 幻读(Phantom Read) | 备注 |
未提交读(Read uncommitted) | 可能 | 可能 | 可能 | |
已提交读(Read committed) | 不可能 | 可能 | 可能 | |
可重复读(Repeatable read) | 不可能 | 不可能 | 不可能 | 默认隔离级别 |
可串行化(Serializable) | 不可能 | 不可能 | 不可能 |
- 未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据。
- 提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)。事务内相同的查询,由于中间可能有数据更新,每次结果可能不同。除了外键和重复键校验,没有使用间隙锁,存在幻读。
- 可重复读(Repeated Read):InnoDB默认级别。一个事务内,相同的查询,都是用该查询第一次产生到镜像,所以保证相同查询到结果相同(mvcc,multi-versioned concurrency control),保证可重复读。使用了gap lock和 next-key lock,保证不存在幻读。同一个事务内,相同查询,中间如果发生对查询结果有影响的操作,第二次相同查询结果会变化。
https://liuzhengyang.github.io/2017/04/18/innodb-mvcc/
- 串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。
- 脏读:可以读取未提交事务的更改结果。
- 不可重复读:相同查询,同一条记录,两次查询内容不同。
- 幻读:相同查询,两次查询记录数量不同。
幻读与不可重复读的区别:
https://en.wikipedia.org/wiki/Isolation_%28database_systems%29#Non-repeatable_reads
查看隔离级别:
SELECT @@global.transaction_isolation;
SELECT @@session.transaction_isolation;
暂停5秒:select sleep(5);
InnoDB Architecture
https://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-isolation-levels.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-next-key-locking.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-consistent-read.html
http://hedengcheng.com/?p=771#_Toc374698310
https://dev.mysql.com/doc/internals/en/
排它锁:
Record Lock:单纯锁定一行,ABC,更新B,锁住B
Gap Lock:锁定目标记录周边的记录,ABC,更新B,锁住AB、BC,防止在A与B和B与C中间插入记录,防止幻读
Next-key Lock:锁定目标及周边的记录,ABC,更新B,锁住AB、B、BC,防止在A与B和B与C中间插入记录,防止幻读
以上是关于Mysql 知识点的主要内容,如果未能解决你的问题,请参考以下文章