Mysql-锁

《InnoDB存储引擎》阅读笔记

InnoDB存储引擎的行级锁:

  • 共享锁:允许事务读一行
  • 排他锁:允许事务更新或者删除一行

表锁意向锁 主要是为了在一个事务中揭示下一行将被请求的锁的类型

  • 意向共享锁:事务想要获得一个表中某几行的共享锁
  • 意向排他锁:事务想要获得一个表中某几行的排他锁

非锁定一致性读

默认情况下InnoDB的select使用非锁定一致性读

一致性的非锁定行读是指InnoDB存储引擎通过行多版本控制的方式来读取当前执行时间数据库中的行数据 即如果被读取行上正在进行delete或者update操作 此时的读取操作不用等待其行锁释放 而是读取该行的一个快照数据。

快照数据其实就是该行数据的历史版本 可能有多个版本 这种技术称为行多版本技术 由此带来的是多版本并发控制(MVCC)

但在不同的事务隔离级别下 读取的方式不一样 在read committed隔离级别下 非锁定一致性读总是读取该行的最新快照 而repeatable read总数读取事务开始时的行数据快照。

mAvMeH.jpg

对于read committed隔离级别 总是读取快照的最新版本 所以是

1
Empty set (0.00 sec)

对于repeatable read总数读取事务开始时的快照版本

1
2
id = 1
1 row in set (0.00 sec)

锁的算法

  • record lock: 单个行记录上的锁
  • gap lock: 间隙锁 锁定一个范围 不包括记录本身
  • Next-key lock: 锁定一个范围 并且锁定记录本身

锁带来的三种问题

  • 丢失更新

mECtlq.jpg

  • 脏读

脏页指缓冲池中已经被修改的页还没刷到磁盘 但日志都已经被写入重做日志中
脏数据指缓冲池中被修改的数据 并且还没有被提交

  • 不可重复读
Donate here.