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

按照上面的兼容性,如果不同事务之间的锁兼容,则当前加锁事务可以持有锁,如果有冲突则会等待其他事务的锁释放。

如果一个事务请求锁时,请求的锁与已经持有的锁冲突而无法获取时,互相等待就可能会产生死锁。

意向锁不会阻止除了全表锁定请求之外的任何锁请求。
意向锁的主要目的是显示事务正在锁定某行或者正意图锁定某行。

 

posted on 2020-05-08 02:37  ksy_c  阅读(132)  评论(0)    收藏  举报