【2019秋冬】【MySQL】MySQL技术内幕 第六章 锁

锁用于管理对共享资源的并发访问
不同的存储引擎有不同的锁机制

latch&lock
latch 是轻量级的锁,时间短,线程锁。在InnoDB中可分为互斥锁和读写锁,用来保证并发线程操作临界资源的正确性,没有死锁检测
lock是事务锁,锁定数据库中的对象,例如表,页,行。lock仅在事务commit或rollback后释放,有死锁机制

InnoDB中锁的类型
共享锁 S锁 读取行数据
排他锁 X锁 修改行数据
意向共享锁 IS锁 读取表数据
意向排他锁 IX锁 修改表数据

兼容性:
X锁都不兼容
IX锁对 S X锁不兼容

细粒度的锁要等待粗粒度的(更小级别的等待更大级别的,对低级别的上锁就要先对高级别的上意向锁,如果意向锁冲突,就得等待)

一致性非锁定读
比书上讲的更好理解一些的讲解
当InnoDB采用行多版本控制来读取某行数据时,如果该数据已经X锁,可以绕过X锁(就是不等他完事),读取该行数据的快照数据(其他版本)
这样做可以提高并发性(疑问:读取的数据发生了变化呀?那我读了没变化的有什么意义呢?)
行多版本控制:通过undo日志,保留行数据之前的版本,不加锁,方便读,没有额外开销

一致性锁定读
通过select语句加X或S锁,保持其一致性,不被乱读

使用情况:
一致性锁定读:对数据一致性,实时性比较高的情况下(会破坏事务隔离性,比较慢,性能低)
一致性非锁定读: 对数据一致性,实时性不高的情况下(数据可能不是最新的,不会破坏事务隔离性)

自增长锁
就是增加行序号的,保证顺序
每个含有自增长值的表都有一个自增长计数器

外键锁
外键用于引用完整性的约束检查
InnoDB中如果没有显式的对外键列加索引,就会自动加索引
在外键值改变时,需要先查询父表。
疑问:外键锁在哪???
解答:首先要搞明白主键,外键
主键是可以唯一确定当前数据的
外键是与其他表关联的,外键是其他表的主键
因此,要给外键加锁,否则当其他表和当前表进行修改操作时会容易出现错误

行锁的三种算法
Record Lock:给当前行上锁
Gap Lock:给一个范围上锁,但不锁定当前行
Next-Key Lock:前两个锁的结合,给一个范围上锁,包括当前行,左开右闭( ]
previous-key Lock:同Next-Key Lock ,左闭右开[ )

当查询的索引包含唯一属性时(比如主键),Next-Key Lock会自动转化为Record Lock,就不锁定范围,只锁定当前行,方便其他事务进行操作,不用等待
当给非聚集索引上锁时,使用Next-Key Lock,对其前一个值做范围上锁,同时,InnoDB存储引擎还会自动给后一个值的范围加Gap Lock 防止幻读

幻读Phantom Problem
幻读指在同一事务下,连续执行两次相同的SQL语句可能得到不同的效果,第二次返回之前不存在的行
在默认的事务隔离级别下,InnoDB采用Next-Key Lock避免幻读

脏读Dirty Read
脏读指在不同事务下,当前事务可以读取到其他事务未提交的数据
脏页:在缓冲池中已经被修改但是还没进入磁盘的页;实例中的页与磁盘中的页不一致
脏数据:事务对缓冲池中行记录进行修改,并没有提交
脏页可以被读取,最终都会一致,但脏数据不可以

不可重复读
不可重复读指在一个事务多次读取同一数据,因为其他事务的插入,修改了数据,导致第一个事务前后读取到的数据不同
不可重复读和脏读的区别是:脏读读取的是未被提交的数据,不可重复读读到的是已经提交的数据
不可重复读也可以理解为幻读

丢失更新
丢失更新指一个事务的更新被另一个事务的更新覆盖,导致数据不一致

死锁
死锁是指两个或两个以上的事务在执行过程中,因争夺资源而造成的一种相互等待的现象
解决办法:
1.等待都化为回滚:并发能力下降,导致事务无法进行
2.超时,等待时间超过一个值,将其中一个回滚,另一个执行。根据FIFO机制回滚。
3.等待图(wait-for graph)
该方法要求数据库保存锁的信息链表和事务等待链表,根据这两个链表构造图,事务是节点,a指向b的边代表a,b等待相同的资源并且a在b的后面。如果图中有回路,说明有死锁。

事务数量越多,越容易死锁
每个事务操作数量越多,越容易死锁
可操作数据越小,越容易死锁
死锁只发生在并发情况下

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值