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中间插入记录,防止幻读

原文地址:https://www.cnblogs.com/lvjianwei/p/9809844.html