【MySQL】锁机制 -- 死锁

举报
原来是咔咔 发表于 2022/03/26 23:37:08 2022/03/26
【摘要】  序言 如何保证数据并发访问的一致性和有效性,是所有数据库必须解决的一个问题。另外,锁冲突也是影响数据库并发性能的一个重要因素,应用程序在选择锁类型时,需要根据实际运行的需要,选择最佳的锁类型  锁类型 Myisam和Memory引擎使用的是表级锁 innodb引擎使用的是行级锁 BDB引擎使用的是页级...

 序言

如何保证数据并发访问的一致性和有效性,是所有数据库必须解决的一个问题。另外,锁冲突也是影响数据库并发性能的一个重要因素,应用程序在选择锁类型时,需要根据实际运行的需要,选择最佳的锁类型

 锁类型

Myisam和Memory引擎使用的是表级锁

innodb引擎使用的是行级锁

BDB引擎使用的是页级索

锁解释

行级锁:他直接锁住的是一条记录,开销大,加速慢,发生锁冲突的概率较低,并发度很高。

页级索:它锁住的是一个页面,在innodb中一个页面为16kb,它的开销介于表级锁和行级锁中间,也可能会出现死锁,锁定粒度也介于表级锁和行级锁中间,并发度也介于表级锁和行级锁中间

表级索:他直接锁住的是一个表,开销小,加锁快,不会出现死锁的情况,锁定粒度大,发生锁冲突的概率更高,并发度最低

innodb行级锁

innodb有俩种类型的行级锁,俩种内部使用的意向锁。

  • 共享锁(S):允许一个事务读一行数据时,阻止其他的事务读取相同数据的排他锁。
  • 排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据的共享锁和排他锁。他锁
  • 意向共享锁(IS):事务打算给数据行加行共享锁。事务在给一个数据行加共享锁前必须先取得该表的IS锁。
  • 意向排他锁(IX):事务打算给数据行加行排他锁。事务在给一个数据行加排他锁前必须先取得该表的IX锁。
  • 悲观锁(抽象,不真实存在的锁)
  • 乐观锁(抽象,不真实存在的锁)

共享锁,只可以读不可以写

排它锁,不可以读也不可以写

4种锁的共存逻辑关系表

锁模式 共享锁(S) 排他锁(X) 意向共享锁(IS) 意向排他锁(IX)
共享锁(S) 兼容 冲突 兼容 冲突
排他锁(X) 冲突 冲突 冲突 冲突
意向共享锁(IS) 兼容 冲突 兼容 兼容
意向排他锁(IX) 冲突 冲突 兼容 兼容

共享锁的使用

共享锁跟共享锁

image.png

共享锁跟排它锁

image.png

image.png

死锁情况

image.png

对于锁的建议


  
  1. 收集死锁信息:
  2. 利用命令 SHOW ENGINE INNODB STATUS查看死锁原因。
  3. 调试阶段开启 innodb_print_all_deadlocks,收集所有死锁日志。
  4. 减少死锁:
  5. 使用事务,不使用 lock tables 。
  6. 保证没有长事务。
  7. 操作完之后立即提交事务,特别是在交互式命令行中。
  8. 如果在用 (SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE),尝试降低隔离级别。
  9. 修改多个表或者多个行的时候,将修改的顺序保持一致。
  10. 创建索引,可以使创建的锁更少。
  11. 最好不要用 (SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE)。
  12. 如果上述都无法解决问题,那么尝试使用 lock tables t1, t2, t3 锁多张表

文章来源: blog.csdn.net,作者:咔咔-,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/fangkang7/article/details/97632974

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。