文章目录

  • 1. 事务之间对资源访问顺序的交替
  • 2. 并发修改同一记录
  • 3. 索引不当导致的死锁

目前,我们已经探讨了许多关于数据库锁的问题,锁能够有效地解决并发的问题,但这也带来了一个严重的缺点,那就是死锁。

死锁在操作系统中指的是两个或两个以上的进程在执行的过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或者系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

在操作系统中,死锁的处理是一个重要的话题,也已经有较为成熟的解决方法,如银行家算法等,在这边我们就不再阐述,只讨论数据库中的死锁。

数据库中常见的死锁原因与解决方案有:

1. 事务之间对资源访问顺序的交替

出现原因:
一个用户A 访问表A(锁住了表A),然后又访问表B;另一个用户B 访问表B(锁住了表B),然后企图访问表A;这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B才能继续,同样用户B要等用户A释放表A才能继续,这就死锁就产生了。

解决方法:
这种死锁比较常见,是由于程序的BUG产生的,除了调整的程序的逻辑没有其它的办法。仔细分析程序的逻辑,对于数据库的多表操作时,尽量按照相同的顺序进行处理,尽量避免同时锁定两个资源,如操作A和B两张表时,总是按先A后B的顺序处理, 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源

2. 并发修改同一记录

出现原因:主要是由于没有一次性申请够权限的锁导致的。参考:记录一次死锁排查过程

用户A查询一条纪录,然后修改该条纪录;这时用户B修改该条纪录,这时用户A的事务里锁的性质由查询的共享锁企图上升到独占锁,而用户B里的独占锁由于A有共享锁存在所以必须等A释放掉共享锁,而A由于B的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁。这种死锁比较隐蔽,但在稍大点的项目中经常发生。

解决方法:

a. 乐观锁,实现写-写并发

b. 悲观锁:使用悲观锁进行控制。悲观锁大多数情况下依靠数据库的锁机制实现,如Oracle的Select … for update语句,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。

3. 索引不当导致的死锁

出现原因:
如果在事务中执行了一条不满足条件的语句,执行全表扫描,把行级锁上升为表级锁,多个这样的事务执行后,就很容易产生死锁和阻塞。类似的情况还有当表中的数据量非常庞大而索引建的过少或不合适的时候,使得经常发生全表扫描,最终应用系统会越来越慢,最终发生阻塞或死锁。

另外一种情况是由于二级索引的存在,上锁的顺序不同导致的,这部分在讨论索引时会提到。参考:https://www.cnblogs.com/LBSer/p/5183300.html

解决方法:

SQL语句中不要使用太复杂的关联多表的查询;使用“执行计划”对SQL语句进行分析,对于有全表扫描的SQL语句,建立相应的索引进行优化。

那么,如何尽可能的避免死锁呢?

1)以固定的顺序访问表和行。即按顺序申请锁,这样就不会造成互相等待的场面。

2)大事务拆小。大事务更倾向于死锁,如果业务允许,将大事务拆小。

3)在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁概率。

4)降低隔离级别。如果业务允许,将隔离级别调低也是较好的选择,比如将隔离级别从RR调整为RC,可以避免掉很多因为gap锁造成的死锁。

5)为表添加合理的索引。如果不走索引将会为表的每一行记录添加上锁,死锁的概率大大增大。

数据库死锁及解决办法相关推荐

  1. 数据库死锁的解决办法

    一.破坏死锁的四个必要条件 二.如果发生死锁,通过SQL语句关闭当前发生死锁的数据库进程 USE master --不能用 KILL 来取消您自己的进程. GO /****** Object:  St ...

  2. 数据库死锁及解决方法

    数据库死锁及解决方法 参考文章: (1)数据库死锁及解决方法 (2)https://www.cnblogs.com/wezheng/p/8366029.html 备忘一下.

  3. restore还原不同名称的数据库_Sql Server 备份还原失败错误ERROR:3145(备份集中的数据库备份与现有的数据库不同)及解决办法...

    一.前言 SQL Server 备份和还原全攻略,里面包括了通过SSMS操作还原各种备份文件的图形指导,SQL Server 数据库最小宕机迁移方案,里面使用SQL脚本(T-SQL)完成完全备份.差异 ...

  4. ORA-01109:数据库未打开 解决办法

    ORA-01109:数据库未打开 解决办法 直接上办法 先来张操作截图 具体操作步骤 问题解读 直接上办法 先来张操作截图 具体操作步骤 1.打开sqlplus.exe 2.请输入用户名: 用户名 a ...

  5. DreamMail无法打开邮件数据库问题的解决办法

    DreamMail无法打开邮件数据库问题的解决办法 (http://blog.csdn.net/kingspider/) DreamMail(http://www.dreammail.org/)是一个 ...

  6. mysql远程无法登陆_无法远程登陆MySQL数据库几种解决办法

    无法远程登入MySQL数据库的解决办法一: 尝试用MySQL Adminstrator GUI Tool登入MySQL Server,Server却回复错误讯息:Host '60-248-32-13. ...

  7. win10远程桌面连接报错(出现身份验证错误。要求的函数不受支持。CredSSP 加密数据库修正)解决办法

    某天使用win10系统进行远程桌面连接时,出现了连接失败的情况,提示: 出现身份验证错误. 要求的函数不受支持 这可能是由于 CredSSP 加密数据库修正. 多次重试,问题依旧,而以往是可以正常进行 ...

  8. 连接阿里云服务器上MySQL数据库失败的解决办法

    一 数据库配置,MySQL默认是不能远程连接 只需要在/etc/mysql下的my.cnf文件里注释掉bind-address = 127.0.0.1 就可以了,如图: 二 安全组设置 阿里云服务器默 ...

  9. SqlServer数据库置疑的解决办法

    导读: /*--重置置疑状态 1.系统方法: 如果 sql server 因为磁盘驱动器不再有可用空间,而不能完成数据库的恢复, 那么 microsoft® sql server™ 2000 会返回错 ...

最新文章

  1. 转:Oracle greatest函数
  2. 转 让开发自动化: 使用自动化加速部署
  3. 解决ora-00054 Oracle锁表问题
  4. 《Visual C# 2010入门经典》一导读
  5. VBS转化为exe可执行文件实例演示,vbs转exe工具推荐
  6. 【Web自动化测试——代码篇十二】自动化测试模型——数据驱动测试和关键字驱动测试...
  7. 极客技术专题【009期】:web技术开发小技巧
  8. javascript基本函数
  9. 支付宝支付返回通知时 notify_url和return_url的选择
  10. Leetcode每日一题:992.sort-array-by-parity-ii(按奇偶排序数组Ⅱ)
  11. 东北大学c语言及程序设计题库,东北大学c语言编程试题及其答案
  12. 我的世界seus光影java版下载_我的世界0.17SEUS PE光影材质包(水反高清)下载
  13. JavaScript DOM之Element对象属性innerHTML、innerText和outerHTML三者的区别
  14. 关于2020计算机考研。
  15. 实现在线预览 pdf 以及添加水印
  16. hadoop之大数据生态系统的前世今生
  17. KeyError: ‘label‘
  18. 这些好用的跨境电商插件,你都听说几个?
  19. 撤县设区,就能过城里人的生活了?
  20. 双非渣本,5年从三流外包到阿里P6,面筋分享,给2021的移动开发一些建议

热门文章

  1. UML之教学管理系统 实验三
  2. 值得收藏的办公软件!!各个功能强大!!
  3. numpy是python标准库吗_吐血 整理!140种Python标准库、第三方库和外部工具都有了...
  4. 推荐15款很棒的 JavaScript 开发工具
  5. 电路设计中,0R电阻有什么用呢?
  6. 讨厌手写,印度小哥开源了一个手写体转换工具,支持中文
  7. 桩基础资料竣工图系列软件
  8. 简述企业信息化的主要工作内容
  9. css中的@inport 与link
  10. uni-app在线签名功能,签名生成图片,转base64工具