MySQL技术内幕Chapter6锁

一、lock与latch

latch 指轻量级锁,要求锁定时间短,innodb中可分为mutex和rwlock,用于确保并发线程操作临界资源的正确性,且没有死锁检测。

lock 的对象是事务

 

查看lock信息:命令show engine innodb status

以及information_schema下的innodb_trx、innodb_locks、innodb_lock_waits,分析事务可能存在锁问题

 

二、锁的类型

1.类型

    1.共享锁(S),允许事务读一行数据

    2.排他锁(X),允许事务删除或更新一行数据

 

innodb支持多粒度锁定,允许事务在行级和锁级锁同时存在,并使用意向锁实现对不同粒度的加锁。对细粒度对象加锁之前要先对粗粒度对象加锁。

innodb意向锁即为表级别的锁,目的主要在于在一个事务中揭示下一行即将被请求的锁类型。

 

 

 

2.一致性非锁定读

当读取的行正在被delete或update时,读取操作不会等待行上锁的释放,而是会去读一个快照数据,即之前版本的数据,是由undo段来完成。

从而极大提升了数据库并发性,而行记录快照也不止一个版本,因此带来的并发控制,称为多版本并发控制。

RC模式下,快照指被锁定行最新一份快照数据,RR模式下,快照指事务开始时行数据版本。

 

 

3.一致性锁定读

某些情况下,用户需显式地对读操作进行加锁以确保数据一致性,innodb支持两种一致性锁定读操作:

    1.select for update

    2.select lock in share mode

for update加的是X锁,share mode则是S锁 ,二者必须在事务中

 

4.自增长与锁

自增长表有一个计数器,当对表插入时,计数器被初始化,这种方式称为AUTO-INC Locking,为了提高性能,锁的释放不是在事务执行完后,而是SQL完成后立即释放,但是仍存在并发性能差的情况,因而innodb使用一种轻量级互斥量的自增长锁实现机制,innodb_autoinc_lock_mode,默认1。

先对插入类型进行分类,而参数不同取值影响如下:

ps: MyISAM是表级锁,自增不存在并发问题,另一方面,innodb自增列必须是索引且是索引的第一列,否则会抛异常,MyISAM则不存在。

 

5.外键与锁

外键主要用于对引用完整性的约束检查,对于外键列,innodb会自动对其加索引,以避免表锁,而对于外键的插入与更新,需要先select父表,但不是采用一致性非锁定读,这会导致数据不一致,而是使用lock in share mode,加S锁。若此时父表有X锁,则子表操作阻塞。

 

三、锁的算法

1.行锁的三种算法

Record Lock:行锁

Gap Lock:间隙锁,锁定一个范围但不包含记录本身

Next-Key Lock:Gap Lock+Record Lock,锁定一个范围且包含记录本身

next-key lock主要用于解决幻读,使用next-key-locking算法,除此之外还有precious-key-locking算法,实现入下:

当查询索引含有唯一属性时,innodb会将next-key lock优化为record lock。如右上所示,当a为主键唯一时,仅锁定5这个值,而不是范围,从而提高并发性能。

当索引为辅助索引时,则会加上间隙锁,锁定范围。

对a为行锁,对b则(1,3)与(3,6)加上间隙锁,故下面三局SQL都会阻塞

显式关闭gap lock方式有:将事务级别调整到RC或者将innodb_locks_unsafe_for_binlog设置为1

 

2.锁问题

    2.1脏数据是指事务对缓存中的数据进行修改,并且没有提交,脏读则违反了数据库的隔离性。而脏页只是内存与磁盘的异步造成,并不影响数据一致性。

    2.2不可重复读读了已提交的数据,违反了数据库事务的一致性。

    2.3间隙锁不仅锁住索引本身,而且还对索引覆盖的范围进行锁定,在这个范围内的插入都是不允许的。

 

四、阻塞与死锁

1.阻塞

    innodb_lock_wait_timeout用来控制等待的时间,默认50s。

2.死锁

    解决死锁的最简单方法就是超时,当两个事务相互等待时,当其中一个等待时间超过阈值时,对其事务进行回滚。现在数据库普遍采用wait_for_graph等待图机制。

内部主要保存:锁的信息链表,事务等待链表。

若存在死锁,innodb选择回滚undo量最小的事务

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值