
• 行锁 Record Lock: 锁定具体行记录,依附于索引存在
• 间隙锁 Gap Lock: 针对行记录之间的空隙加锁
• 临键锁 Next-Key Lock: 本质上是间隙锁加行锁形成的组合
• 意向锁 Intention Lock: 在具体操作行为前进行意向声明
加锁锁住的其实是索引项,更加具体地来说,就是锁住了叶子节点。
一个表有很多索引,锁的是哪个索引呢?其实就是查询最终使用的那个索引。万一查询没有使用任何索引呢?那么锁住的就是整个表,也就是此时退化为表锁。
只有在执行 Rollback 或者 Commit 的时候,锁才会被释放掉。
乐观锁是直到要修改数据的时候,才检测数据是否已经被别人修改过。悲观锁是在初始时刻就直接加锁保护好临界资源。
乐观锁适用于读多写少的场景,互联网中大部分应用都属于这一类。而悲观锁则适用于写多读少的场
景,比如在金融领域里面对金额的操作就是以写为主。
乐观锁的性能要比悲观锁好很多。不过因为乐观锁的代码写起来比较复杂,所以很多人偷懒就会直接使用悲观锁。
SELECT*FROMyour_tabWHEREid=1FORUPDATE;//在这里拿到了a=1
// 一大堆的业务操作
UPDATEyour_tabSETa=3,b=4WHEREid=1
一般来说,行锁是指锁住行,可能是锁住一行,也可能是锁住多行。表锁则是直接将整个表都锁住。
行锁是借助索引来实现的,也就是说,如果你的查询没有命中任何的索引,那么 InnoDB 引擎是用不了行锁的,只能使用表锁。当然,如果用的是 MySQL,类似于 MyISAM 引擎,那么只能使用表锁,因为这些引擎不支持行锁。