mysql记录锁

该文章在Innodb引擎下

记录锁

记录锁是锁住记录,锁住索引记录,而不是真正的数据记录

  • 锁是非主键索引,会在索引记录上加锁后,在去主键索引上加锁
  • 表上没有索引,会在隐藏的主键索引上加锁
  • 如果要锁的列没有索引,进行全表记录加锁

间隙锁

不是针对某一记录加锁,而是锁定一个范围,也被称为gap锁,不会阻塞其他gap锁,但会阻塞插入间隙锁,这也是防止幻读的关键(RR隔离,Innodb默认隔离)

next-key锁

该锁是记录锁加gap锁,在RR隔离级别下,对行的扫描、锁定都是使用这种锁。如果查询中包含唯一索引,就会只适用记录锁。因为唯一索引能确定记录行数,其他索引不能确定行数,有可能在其他事务中添加这个索引的数据导致幻读。

插入意向锁

官方解释:

An insert intention lock is a type of gap lock set by INSERT operations prior to row insertion. This lock signals the intent to insert in such a way that multiple transactions inserting into the same index gap need not wait for each other if they are not inserting at the same position within the gap. Suppose that there are index records with values of 4 and 7. Separate transactions that attempt to insert values of 5 and 6, respectively, each lock the gap between 4 and 7 with insert intention locks prior to obtaining the exclusive lock on the inserted row, but do not block each other because the rows are nonconflicting.

可以看出插入意向锁是在插入的时候产生的,在多个事务同时写入不同数据至同一索引间隙的时候,并不需要等待其他事务完成,不会发生锁等待。

这里要说明的是如果有间隙锁了,插入意向锁会被阻塞。

MVCC

MVCC,多版本并发控制技术。在 InnoDB 中,在每一行记录的后面增加两个隐藏列,记录创建版本号和删除版本号。通过版本号和行锁,从而提高数据库系统并发性能。

MVCC,读有两种方式:

  • 快照读:读取的历史数据,简单的 select 语句,不加锁,MVCC 实现可重复读,使用的是 MVCC 机制读取 undo 中的已经提交的数据。所以它的读取是非阻塞的。
  • 当前读:需要加锁的语句,update,insert,delete,select…for update 等等都是当前读。

在 RR 隔离级别下的快照读,不是以 begin 事务开始的时间点作为 snapshot 建立时间点,而是以第一条 select 语句的时间点作为 snapshot 建立的时间点。以后的 select 都会读取当前时间点的快照值。

在 RC 隔离级别下每次快照读均会创建新的快照,所以RC隔离级别下会出现幻读。

具体的原理是通过每行会有两个隐藏的字段一个是用来记录当前事务,一个是用来记录回滚的指向 Undolog。利用 Undolog 就可以读取到之前的快照,不需要单独开辟空间记录。

死锁

相互等待资源造成死锁,上面描述中说,有间隙锁时,意向插入锁会被阻塞。当两个事务,在同一间隙上都加锁(间隙锁相同兼容,不会阻塞),同时在这一间隙内插入数据,会导致相互等待间隙锁,造成死锁。

防止死锁
  • 以固定的顺序访问表和行。交叉访问更容易造成事务等待回路。
  • 尽量避免大事务,占有的资源锁越多,越容易出现死锁。建议拆成小事务。
  • 降低隔离级别。如果业务允许,将隔离级别调低也是较好的选择,比如将隔离级别从 RR 调整为 RC,可以避免掉很多因为 gap 锁造成的死锁。
  • 为表添加合理的索引。防止没有索引出现表锁,出现死锁的概率会突增。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值