Fork me on GitHub

mysql中的锁

mysql中的全局锁和表锁,行锁


mysql5.5版本后,表级的锁是 MDL(metadata lock)
虽然 MDL 锁是系统默认会加的,读写不冲突.给一个表加字段,或者修改字段,或者加索引,需要扫描全表的数据.
所以给表加字段时候要多加小心.information_schema 库的 innodb_trx 表中,你可以查到当前执行中的事务。如果你要 做 DDL 变更的表刚好有长事务在执行,要考虑先暂停 DDL,或者 kill 掉这个长事务.
如果是热点表,那么除非是mysql开源的alisql 或者MariaDB.
alert table table_name wait on N add column.

在 InnoDB 中,innodb_lock_wait_timeout 的默认值是 50s,还有就是设置死锁检测innodb_deadlock_detect 默认值就是on
开启默认死锁检测的, 这样也会导致,大量并发的线程,每次都要进行检测,并发上不去的原因.cup使用率过高.

热点表,关闭掉死锁的检测是业务有损的,另外一种就是控制并发度.如果没有中间件和修改源码的能力..
原理是 在同时修改一个表中的同一条记录时候,进行排队…
总之从减少修改同表同记录的次数..

死锁检测是怎么运行的?

  1. 如果是要加锁的行上有锁,那么它就要检测..
  2. 一致性读是不会加锁的,就不需要死锁检测.
  3. 并不是每次死锁的检测都扫描全部的事务.

    例如 B在等A执行完毕.
    D在等C
    那么来了个E ,E需要等D . 那么 只会检测 D和C 是否有死锁的情况.和A,B无关.

  4. dml时会产生读MDL锁(表锁),也就是update会持有读MDL。读和 读不互斥。但是对于行锁来说。两个update同时更新一条数据是互斥的。这个是因为多种 锁同时存在时,要同时满足不互斥才可以的.多种锁存在的情况…


    本文欢迎转载,但是希望注明出处并给出原文链接。
    如果你有任何疑问,欢迎在下方评论区留言,我会尽快答复。
    如果你喜欢或者不喜欢这篇文章,欢迎你发邮件到 alonecong@126.com 告诉我你的想法,你的建议对我非常重要。



    本文作者: lancecong
    联系方式: alonecong@126.com
    版权声明: 除特别声明外,所有文章均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

本文欢迎转载,但是希望注明出处并给出原文链接。 如果你有任何疑问,欢迎在下方评论区留言,我会尽快答复。 如果你喜欢或者不喜欢这篇文章,欢迎你发邮件到 alonecong@126.com 告诉我你的想法,你的建议对我非常重要。

------ 本文结束感谢您的阅读! ------
0%