数据库和操作系统一样,是一个多用户使用的共享资源。当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。加锁是实现数据库并 发控制的一个非常重要的技术。在实际应用中经常会遇到的与锁相关的异常情况,当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁,严 重影响应用的正常执行。

在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两 种基本的锁类型来对数据库的事务进行并发控制。

死锁的第一种情况

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

解决方法:

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

死锁的第二种情况

用户A查询一条纪录,然后修改该条纪录;这时用户B修改该条纪录,这时用户A的事务里锁的性质由查询的共享锁企图上升到独占锁,而用户B里的独占锁由于A 有共享锁存在所以必须等A释放掉共享锁,而A由于B的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁。这种死锁比较隐蔽,但在稍大点的项 目中经常发生。如在某项目中,页面上的按钮点击后,没有使按钮立刻失效,使得用户会多次快速点击同一按钮,这样同一段代码对数据库同一条记录进行多次操 作,很容易就出现这种死锁的情况。

解决方法:

1、对于按钮等控件,点击后使其立刻失效,不让用户重复点击,避免对同时对同一条记录操作。

2、使用乐观锁进行控制。乐观锁大多是基于数据版本(Version)记录机制实现。即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是 通过为数据库表增加一个“version”字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数 据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。乐观锁机制避免了长事务中的数据 库加锁开销(用户A和用户B操作过程中,都没有对数据库数据加锁),大大提升了大并发量下的系统整体性能表现。Hibernate 在其数据访问引擎中内置了乐观锁实现。需要注意的是,由于乐观锁机制是在我们的系统中实现,来自外部系统的用户更新操作不受我们系统的控制,因此可能会造 成脏数据被更新到数据库中。

3、使用悲观锁进行控制。悲观锁大多数情况下依靠数据库的锁机制实现,如Oracle的Select … for update语句,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。如一个金融系统, 当某个操作员读取用户的数据,并在读出的用户数据的基础上进行修改时(如更改用户账户余额),如果采用悲观锁机制,也就意味着整个操作过程中(从操作员读 出数据、开始修改直至提交修改结果的全过程,甚至还包括操作员中途去煮咖啡的时间),数据库记录始终处于加锁状态,可以想见,如果面对成百上千个并发,这 样的情况将导致灾难性的后果。所以,采用悲观锁进行控制时一定要考虑清楚。

死锁的第三种情况

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

解决方法:

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

5.小结

总体上来说,产生内存溢出与锁表都是由于代码写的不好造成的,因此提高代码的质量是最根本的解决办法。有的人认为先把功能实现,有BUG时再在测试阶段进 行修正,这种想法是错误的。正如一件产品的质量是在生产制造的过程中决定的,而不是质量检测时决定的,软件的质量在设计与编码阶段就已经决定了,测试只是 对软件质量的一个验证,因为测试不可能找出软件中所有的BUG。

mysql 数据库表被锁住了_mysql数据库锁的产生原因及解决办法相关推荐

  1. mysql sleep详解_mysql sleep链接过多的原因及解决办法

    今天收到运维同事短信,说有个线上业务"可能是数据库DB堵塞了,导致mysql链接过多,让我看一下". 回家后赶紧用家里vpn登录数据库服务器,show processlist 看了 ...

  2. mysql保存时乱码了_MySQL保存中文乱码的原因和解决办法

    (3)MySQL的字符集设置. 这个是重点了,一般都是在这里搞错而出现了mysql乱码. mysql编码设置可以分为三种设置:数据库的编码.表的编码.和字段的编码. a.数据库的编码: 在sqlyog ...

  3. mysql 无法登陆_MySQL root用户无法登录原因及解决办法

    MySQL root密码正确,却怎么也bai无法du从本地登录MySQL登录提示ERROR 1045 (28000): Access denied for user 'root'@'localhost ...

  4. mysql 主从同步不一致_MySQL 主从同步延迟的原因及解决办法

    mysql 用主从同步的方法进行读写分离,减轻主服务器的压力的做法现在在业内做的非常普遍. 主从同步基本上能做到实时同步.我从别的网站借用了主从同步的原理图. 在配置好了, 主从同步以后, 主服务器会 ...

  5. mysql relaylog 慢_MySQL 主从同步延迟的原因及解决办法

    mysql 用主从同步的方法进行读写分离,减轻主服务器的压力的做法现在在业内做的非常普遍. 主从同步基本上能做到实时同步.我从别的网站借用了主从同步的原理图. 在配置好了, 主从同步以后, 主服务器会 ...

  6. mysql 数据库表锁死_mysql 数据库表被锁住了_Mysql数据库表锁死如何处理?

    处理方式有如下三种: 1.查询不是sleep或者有状态的sql select * from `information_schema`.processlist where command !='Slee ...

  7. mysql 两个时间相差大于24小时的数据_MySQL 主从同步延迟的原因及解决办法(仅学习)...

    原文链接:https://blog.csdn.net/hao_yunfeng/article/details/82392261 Mysql主从基本原理,主要形式以及主从同步延迟原理 (读写分离)导致主 ...

  8. MySQL 主从同步延迟的原因及解决办法

    首页 博客 专栏·视频 下载 论坛 问答 代码 直播 能力认证 高校 会员中心 收藏 动态 消息 创作中心 MySQL 主从同步延迟的原因及解决办法 hao_yunfeng 2018-09-04 23 ...

  9. mysql数据库什么情况下会锁表_mysql数据库锁的产生原因及解决办法

    数据库和操作系统一样,是一个多用户使用的共享资源.当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性 ...

最新文章

  1. C#中值类型和引用类型
  2. 百度贴吧登录过程分析
  3. 如何将javaweb项目部署到linux下
  4. Visual Studio 2017 针对移动开发的新特性介绍
  5. 朱海舟吐槽iPad办公体验:大量竖屏应用缺乏适配
  6. 【原创】VS2010 C++ Debug 出现 SXS: RtlCreateActivati...
  7. 计算机国二全称,计算机国二的全称是什么?
  8. 解决iPhone模拟器无法启动的方法
  9. 生物光子学 19节 加州大学戴维斯分校
  10. android 拼音过滤、匹配首字母
  11. 关于trycatchfinal返回值问题
  12. 菜鸟渗透日记29---python渗透测试编程之信息收集1-主机发现
  13. 安科瑞预付费系统在电力系统中的应用
  14. 怎么用计算机把浓度转换成PH,ph浓度换算(ph怎么换算OH浓度)
  15. 【Day7.1】张掖七彩丹霞看日出
  16. 用echarts实现水滴图效果
  17. 建议收藏 | IC专业术语盘点
  18. 深入剖析DHCP服务IP地址自动分配原理
  19. Terraform 和 Oracle Cloud Infrastructure
  20. 悟透JavaScript(李站老师)-编程的快乐

热门文章

  1. ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇
  2. python+scapy 抓包与解析
  3. PAT甲级1051 Pop Sequence:[C++题解]模拟栈、判断序列是否是合法的出栈序列
  4. 青海高考成绩查询日期2021,2021年青海高考成绩什么时候出来 公布时间
  5. java表格标题栏_Java MFixedColumnTable (提供行标题栏的表格)
  6. string类有可以调换方向的函数吗_C++中的string类的用法小结
  7. python的迭代器指向第一个字符_python(七)字符串格式化、生成器与迭代器
  8. pythonsuper_用__init __()方法理解Python super()
  9. 使用ado直接连接mysql_使用ADO直接连Mysql ,不经过ODBC
  10. 列出mongodb里的所有表的名字,合并所有表到一个大表,用pandas