1、共享锁 又称S锁,是读锁
#A BEGIN; select * from account WHERE id = 1 LOCK in SHARE MODE; #B select * from account UPDATE account set money = 101 where id = 1 #这里会阻塞等待A
#A
COMMIT; //A提交或回滚后,B会自动执行
2、排他锁 ,又称X锁
#A BEGIN; UPDATE account set money = money+1 where id = 1 //update,delete,insert都会自动给涉及到的数据加上排他锁 #B select * from account WHERE id = 1 //获取成功,获取到A修改前的数据 select * from account for UPDATE //阻塞等待,A有排他锁后B不可同时加排他锁 select * from account WHERE id = 1 LOCK in SHARE MODE; //阻塞等待,A有排他锁后B不可同时加共享锁 UPDATE account set money = money+1 where id = 1 //阻塞等待,理由同上
3、意向共享锁,又称IS
4、意向排他锁,又称IX 3和4是在获取S锁和X锁之前,数据库自动加的锁,用来判断该记录是否已添加锁,不需人为操作
5、自增锁 设置了自增主键,目前自增id为10,插入,5条数据,ROLLBACK后,新增数据,id不会是从11开始,回滚的数据id会被跳过
6、临键锁 对于查询条件<> between 左开右闭已有数据:
id money name 3 33.00 c 8 105.00 d 10 105.00 fs 11 105.00 asd
20 105.00 acc
21 105.00 add
26 102.22 ac
#A BEGIN; SELECT * from account where id >4 and id < 9 for UPDATE; //根据已有数据,加上的锁范围为(3,10]
#B UPDATE account set money = money+1 where id = 10 //阻塞等待 INSERT INTO `9thleaf_51ehw_b`.`account`(`id`, `money`, `name`) VALUES (4, 30.00, 'c'); //阻塞等待 UPDATE account set money = money+1 where id = 3 //成功 UPDATE account set money = money+1 where id = 11 //成功
SELECT * from account where id BETWEEN 3 and 9 for UPDATE;//根据已有数据,加上的锁范围为[3,10]
SELECT * from account where id >4 for UPDATE;//根据已有数据,加上的锁范围为(3,+)
7、间隙锁 没有匹配记录,会降级为间隙锁
#A BEGIN; SELECT * from account where id >22 and id < 25 for UPDATE;//根据已有数据,加上的锁范围为(21,26]
#B
UPDATE account set money = money+1 where id = 22 UPDATE account set money = money+1 where id = 26 //阻塞等待
INSERT INTO `9thleaf_51ehw_b`.`account`(`id`, `money`, `name`) VALUES (22, 30.00, 'c'); //阻塞等待
UPDATE account set money = money+1 where id = 21 //成功
8、记录锁 记录锁就是为某行记录加锁,它封锁该行的索引记录
#A BEGIN; SELECT * from account where id = 8 for UPDATE; //记录为8的会被锁起来 BEGIN; select * from account where id = 8 for UPDATE //阻塞等待
需要注意的是:筛选列必须为唯一索引列或主键列,否则上述语句加的锁就会变成临键锁。
同时查询语句必须为精准匹配(=),不能为 >、<、like等,否则也会退化成临键锁
在通过 主键索引 与 唯一索引 对数据行进行 UPDATE 操作时,也会对该行数据加记录锁: UPDATE SET money= 50 WHERE name= 'aaa';
innodb行锁,锁的是什么
行锁就是给索引上的索引项加锁
锁的兼容性
锁的兼容矩阵如下:
| --- | 排它锁(X) | 意向排它锁(IX) | 共享锁(S) | 意向共享锁(IS) |
|---|---|---|---|---|
| 排它锁(X) | N | N | N | N |
| 意向排它锁(IX) | N | OK | N | OK |
| 共享锁(S) | N | N | OK | OK |
| 意向共享锁(IS) | N | OK | OK | OK |
按照上面的兼容性,如果不同事务之间的锁兼容,则当前加锁事务可以持有锁,如果有冲突则会等待其他事务的锁释放。
如果一个事务请求锁时,请求的锁与已经持有的锁冲突而无法获取时,互相等待就可能会产生死锁。
意向锁不会阻止除了全表锁定请求之外的任何锁请求。
意向锁的主要目的是显示事务正在锁定某行或者正意图锁定某行。
浙公网安备 33010602011771号