参考文档

  1. 我以为我对Mysql事务很熟,直到我遇到了阿里面试官
  2. MVCC多版本并发控制

    **

    基本知识

事务隔离级别

  1. Read Uncommited
    1. 可以读取未提交记录。此隔离级别,不会使用,忽略。
  2. Read Committed (RC)
    1. 一个事务可能会遇到不可重复读(Non Repeatable Read)的问题。
    2. 在一个事务内,多次读同一数据,在这个事务还没有结束时,如果另一个事务恰好修改了这个数据,那么,在第一个事务中,两次读取的数据就可能不一致。
  3. Repeatable Read (RR)
  4. Serializable

多版本并发控制

读不加锁,读写不冲突

快照读,不加锁

  1. select * from table where ?;

当前读,加锁

  1. -- select 上共享锁
  2. select * from table where ? lock in share mode;
  3. -- for update 上排它锁
  4. select * from table where ? for update;
  5. -- 插入,更新,删除 上排它锁
  6. insert into table values (…);
  7. update table set ? where ?;
  8. delete from table where ?;

**

锁类型

X锁:排它锁
S锁:in share mode,允许别人也上S锁,保证大家都查到最新的数据

gap锁: 索引排列

意向锁( Intention Locks )
InnoDB为了支持多粒度(表锁与行锁)的锁并存,引入意向锁。意向锁是表级锁,
IS: 意向共享锁
IX: 意向排他锁
事务在请求某一行的S锁和X锁前,需要先获得对应表的IS、IX锁。
意向锁产生的主要目的是为了处理行锁和表锁之间的冲突,用于表明“某个事务正在某一行上持有了锁,或者准备去持有锁”。比如,表中的某一行上加了X锁,就不能对这张表加X锁。
如果不在表上加意向锁,对表加锁的时候,都要去检查表中的某一行上是否加有行锁,多麻烦。

数据库隔离性%26并发控制%26锁 - 图1