MySql之InnoDB锁

MySql之InnoDB锁

1.行锁和表锁
表锁:不会出现死锁,发生锁冲突几率高,并发低。MyISAM和INNODB都支持
行锁:会出现死锁,发生锁冲突几率低,并发高。INNODB才支持
2.行锁的类型
行锁又分为共享锁,排他锁。
共享锁:读锁,多个事物可以对同一个数据共享同一把锁,持有锁的事物都可以访问数据,但是只能读不能修改
排他锁:写锁,只有一个事物能够获得排他锁,其他事物都不能获取该行的锁,不允许其他事务写,但允许读。更不允许其他事务给这几行上任何锁。innodb会对update\delete\insert语句制动添加排他锁
上共享锁的写法:lock in share mode
上排它锁的写法:for update
不过值得注意的是InnoDB行锁是通过给索引上的索引项加锁来实现的,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁
3.间隙锁
间隙锁是在在索引记录间隙中的一种锁,或者是锁在第一个之前或最后一个之后。
MVCC使RR级别下,事物当前读来避免了读情况下出现幻读的问题,于是就有了间隙锁。间隙锁也属于排他锁。
间隙锁锁住的是一个区间,而不仅仅是区间中的每一条数据。
例如:

SELECT * FROM table WHERE id BETWEN 1 AND 10 FOR UPDATE;
在上诉这个例子中(1,10)区间内的记录都会被锁锁锁住,但是1和10两条记录都不会被锁住
间隙锁在使用唯一索引查询唯一行记录是不需要的,例如id列有唯一索引,那么下面语句只会对id=100的行使用索引记录锁定,其他会在这行记录之前插入也没有关系。不会影响查询结果。如果id不是索引列或不是唯一索引列,那么这条语句就 会锁定10之前的所有间隙

SELECT * FROM child WHERE id = 10;
idab
123
1025
10510
201020

在这种情况下就会锁住字段A 2-5之间的间隙和字段c5-10之间的间隙

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值