事务 acid 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
a : commit 等
c : redoLog undoLog
i : 锁
d : 磁盘
对事务而言, 锁的存在目的是为了事务的隔离性.
当然广义上,锁的存在还是为了控制并发. 控制并发某种意义是就是控制多个线程的隔离.
不同的角度.
一般锁: 可重复读
间隙锁: 防止幻读.
从这个根本出发. 哪些情况会导致幻读,就需要间隙锁.
普通的select 是不锁的.(快照读)
只有 select for update 才锁, 或者 delete ,update里的where条件
1. 区间条件
2. 命中一行,且是非unique
3. 不命中一行,不管是不是unique .
无间隙锁:
1. 命中一行且unique
2. 读提交级别
3.
一般锁: 等价性 a 锁 b, b也锁 a
特殊锁: 间隙锁.
对文章的总结如下:
(1)记录锁:在行相应的索引记录上的锁
(2)gap锁:是在索引记录间歇上的锁
(3)next-key锁:是记录锁和在此索引记录之前的gap上的锁的结合
(4)innodb行锁的加锁方式: 当根据innodb表的索引搜索时, 设置共享锁和排它锁在索引记录上
(5)行锁实际上是索引锁
(6)innodb_locks_unsafe_for_binlog:
当为0时 (disabled), 这个开启了gap锁;设置为1,关闭gap锁(这会导致幻读,引起主从同步不一致)。例子见http://book.51cto.com/art/200803/68129.htm
(7)开启这个选项innodb_locks_unsafe_for_binlog并不关闭gap锁在外键检查方面的作用
(8)在UPDATE和DELETE时,innodb首先对遇到的每一行加行锁;如果innodb_locks_unsafe_for_binlog开启,那么不匹配的行上的锁将被释放;如果未开启,不匹配的行上的锁也不释放,直到事务结束
(9)即使innodb表上没有索引,也会使用内部的clustered index来进行锁定;
(10)innodb除主键的索引之外的其他索引和clustered index在内部是建立一张索引对应表;当利用其他索引扫描记录时,对其他索引加的锁最后都转换为对clustered index加的锁
(11)在UPDATE模式下,对检索中遇到的记录加排它锁;在INSERT...SELECT模式下,对检索中遇到的记录加共享锁;在INSERT模式下,对检索中遇到的记录加排它锁;在DELETE模式下,对检索中遇到的记录加排它锁
(12)在使用unique index进行搜索,并且只返回一行时,不使用gap锁
(13)next-key锁举例:假设索引包括10,11,13,20,则next-key锁为:(negative infinity, 10], (10, 11], (11, 13], (13, 20], (20, positive infinity)
(14)使用next-key锁可以预防幻读
The effects of enabling innodb_locks_unsafe_for_binlog are the same as setting the transaction isolation level toREAD COMMITTED
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!