[MySQL实战45讲]MySQL笔记之数据库锁

备份数据库,全局锁

如果全部使用InnoDB引擎,那么直接 mysqldump -single-transaction 即可

否则用FTWRL语句,即 flush table with read lock。

你发现你的应用程序里有 lock tables 这样的语句

表锁一般是在数据库引擎不支持行锁的时候才会被用到的。

要么是你的系统现在还在用 MyISAM 这类不支持事务的引擎,那要安排升级换引擎

要么是你的引擎升级了,但是代码还没升级。我见过这样的情况,最后业务开发就是把 lock tables 和 unlock tables 改成 begin 和 commit,问题就解决了。

select for update

表示当前读。RR事务普通select查询只会查询最早的view,此时其他事务的update不会被读到

但是select for update则会把更新的update也读到,读取的是当前的数据,而不是RR事务的view数据。

Next-key lock

幻读会导致语义被破坏和数据一致性被破坏两个问题。

为了解决幻读,InnoDB引入了间隙锁(Gap Lock)。间隙锁,锁的就是两个值之间的空隙。比如表中有 6 个记录,就会有 7 个间隙。

间隙锁只会和insert操作产生冲突,其他都不会。

间隙锁和行锁合称 next-key lock,每个 next-key lock 是前开后闭区间。

缺点:可能会导致同样的语句锁住更大的范围,这其实是影响了并发度
的。

设计语句时需要多考虑间隙锁,防止死锁

加锁规则
  1. 原则 1:加锁的基本单位是 next-key lock。next-key lock 是前开后闭区间。
  2. 原则 2:查找过程中访问到的对象才会加锁。
  3. 优化 1:索引上的等值查询,给唯一索引加锁的时候,next-key lock 退化为行锁。
  4. 优化 2:索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,next-key lock 退化为间隙锁。
  5. 一个 bug:唯一索引上的范围查询会访问到不满足条件的第一个值为止。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值