一.锁的分类
1.共享锁(行锁):Shared Locks
1)概念:
共享锁也称读锁,多个事务对于数据可以共享访问,不能操作修改
2)使用方式:
SELECT * from testlock where id=1 LOCK IN SHARE MODE ----加锁
COMMIT/ROLLBACK ---释放锁
2. 排它锁(行锁):Exclusive Locks
1)概念:
写锁,又称互斥锁,独占锁,事务获取了排他锁,其他事务就不能再获取锁,包括读锁也获取不到,只有该获取了排他锁的事务是可以对数据行进行读取和修改
2)使用方式:
DELETE/UPDATE/INSERT ----加锁
SELECT * FROM TABLE WHERE ....For UPDATE ----加锁
COMMIT/ROLLBACK ---释放锁
二.行锁的具体实现
1.临键锁:Next-key Locks
1) 条件:
当SQL执行按照索引进行数据的检索时,且查询条件为范围查找,(between and,<,>等)[执行计划 type=range],且有数据命中时,该SQL语句事务操作加上的行锁为临键锁
2)总结:
范围查询且命中记录,是innodb默认的行锁算法
3)具体实现:
锁住命中记录区间+下一个区间(左开右闭)
例:这边有一张t表,id为主键索引,name为普通字段
2.间隙锁:Gap Locks
1) 条件:
当SQL执行按照索引进行数据检索时,且查询条件的数据不存在时,这时SQL语句加上的锁即为间隙锁
2)总结:
范围查询或者等值查询且记录不存在
3)具体实现:
锁住数据不存在的区间(左开右开)
3.记录锁:Record Locks
1) 条件:
当SQL执行按照等值匹配的方式索引进行数据的检索,且查询条件等值匹配且查询的数据命中存在,这是SQL语句加上的锁即为记录锁
2)总结:
根据索引进行检索,且条件为精准匹配且命中数据
3)具体实现:
锁住具体索引的索引项