`
m635674608
  • 浏览: 4931675 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

数据库死锁分析与解决

 
阅读更多

一、死锁的表现

1、错误信息是:事务(进程 ID)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。

2、错误信息是:事务(进程 ID )与另一个进程被死锁在 锁 | 通信缓冲区 资源上,并且已被选作死锁牺牲品。请重新运行该事务。

二、死锁的原因

1、由于多用户、多任务的并发性和事务的完整性要求,当多个事务处理对多个资源同时访问时,若双方已锁定一部分资源但也都需要对方已锁定的资源时,无法在有限的时间内完全获得所需的资源,就会处于无限的等待状态,从而造成其对资源需求的死锁。

2、数据库本身加锁机制的实现方法不同,各数据库系统也会产生其特殊的死锁情况。如在Sybase SQL Server 11 中,最小锁为 2K
一页的加锁方法,而非行级锁。如果某张表的记录数少且记录的长度较短(即记录密度高,如应用系统中的系统配置表或系统参数表就属于此类表),被访问的频率高,就容易在该页上产生死锁。

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

解决方法:
这种死锁是由于程序的 BUG 产生的,需调整程序对数据库层的实现逻辑。仔细分析程序的逻辑:
(1)尽量避免同时锁定两个资源。
(2)必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源。

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

解决方法:
让用户 A 的事务(即先读后写类型的操作),在 select 时就是用 update lock。
语法如下:select * from table1 with(updlock) where ….

三、常见死锁情况及解决方法

1、不同的存储过程、触发器、动态 SQL 语句段按照不同的顺序同时访问多张表。

在系统实现时应规定所有存储过程、触发器、动态 SQL 语句段中,对多张表的操作总是使用同一顺序。如:有两个存储过程 procedure1、procedure2,都需要访问三张表 table1、table2
和 table3,如果 procedure1 按照 table1、table2 和 table3 的顺序进行访问,那么,procedure2也应该按照以上顺序访问这 3 张表。

2、在交换期间添加记录频繁的表,但在该表上使用了非群集索引(non-clustered)。

对在交换期间添加记录频繁的表,使用群集索引(clustered),以减少多个用户添加记录到该表的最后一页上,在表尾产生热点,造成死锁。这类表多为往来账的流水表,其特点是在交换期间需要在表尾追加大量的记录,并且对已添加的记录不做或较少做删除操作。

3、表中的记录少,且单条记录较短,被访问的频率较高。

对单张表中记录数不太多,且在交换期间 select 或 update 较频繁的表可使用设置每页最大行的办法,减少数据在表中存放的密度,模拟行级锁,减少在该表上死锁情况的发生。这类表多为信息繁杂且记录条数少的表。
如:系统配置表或系统参数表。在定义该表时添加如下语句: with max_rows_per_page=1

4、整张表被访问的频率高(如代码对照表的查询等)。

在存储过程、触发器、动态 SQL 语句段中,若对某些整张表 select 操作较频繁,则可能在
该表上与其他访问该表的用户产生死锁。对于检查账号是否存在,但被检查的字段在检查期间不会被更新等非关键语句,可以采用在 select 命令中使用 at isolation read uncommitted 子句的方法解决。该方法实际上降低了 select 语句对整张表的锁级别,提高了其他用户对该表
操作的并发性。在系统高负荷运行时,该方法的效果尤为显著。
例如: select*from titles at isolation read uncommitted

5、对流水号一类的顺序数生成器字段,可以先执行 update 流水号字段+1,然后再执行 select
获取流水号的方法进行操作。

备注:

NOLOCK(不加锁):此选项被选中时,SQL Server 在读取或修改数据时不加任何锁。在这种情况下,用户有可能读取到未完成事务(Uncommitted Transaction)或回滚(Roll Back)中数据,即所谓的“脏数据”。

UPDLOCK(修改锁):此选项被选中时,SQL Server 在读取数据时使用修改锁来代替共享锁,并将此锁保持至整个事务或命令结束。使用此选项能够保证多个进程能同时读取数据但只有该进程能修改数据。

 

http://blog.csdn.net/hexieshangwang/article/details/47189213

分享到:
评论

相关推荐

    并发访问ORACLE数据库的数据死锁分析和解决措施.pdf

    并发访问ORACLE数据库的数据死锁分析和解决措施.pdf

    数据库 死锁的解决

    数据库 死锁的解决 其实所有的死锁最深层的原因就是一个:资源竞争 表现一: 一个用户A 访问表A(锁住了表A),然后又访问表B 另一个用户B 访问表B(锁住了表B),然后企图访问表A 这时用户A由于用户B已经锁住表B,它...

    HIS系统SQL Server数据库死锁问题的分析与解决.pdf

    HIS系统SQL Server数据库死锁问题的分析与解决.pdf

    db2死锁问题分析及解决方案

    db2死锁问题分析及解决方案,可以快速解决数据库问题。

    Mysql 数据库死锁过程分析(select for update)

    最近有项目需求,需要保证多台机器不拿到相同的数据,后来发现... for update经常导致数据库死锁问题,下面小编给大家介绍mysql 数据库死锁过程分析(select for update),对mysql数据库死锁问题感兴趣的朋友一起学习吧

    MySQL死锁的产生原因以及解决方案

    在实际应用中经常会遇到的与锁相关的异常情况,当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁,严 重影响应用的正常执行。 在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁...

    InnoDB数据库死锁问题处理

    这个异常并不会影响用户使用,因为数据库遇到死锁会自动回滚并重试。用户的感觉就是操作稍有卡顿。但是监控老是报异常,所以需要解决一下。 解决方法 在应用程序中update的地方使用try-catch。 我自己封装了一个函数...

    Java面试-彻底搞懂死锁的前世今生

    怎么避免死锁等问题展开分析,通过大量的代码和案例演示向大家描述死锁的前世今生。 快速到达看这里死锁是什么,有什么危害?写一个死锁的例子案例一:必然发生死锁案例二:两个账户转账案例三:多人多次转账发生...

    MySQL死锁问题分析及解决方法实例详解

    MySQL死锁问题是很多程序员在项目开发中常遇到的问题,现就MySQL死锁及解决方法详解如下: 1、MySQL常用存储引擎的锁机制 MyISAM和MEMORY采用表级锁(table-level locking) BDB采用页面锁(page-level locking)或表级...

    MySQL数据库的一次死锁实例分析

    本文主要给大家通过一个实例来具体介绍MySQL死锁问题的相关知识,接下来我们就来一一介绍这部分内容,希望能够对您有所帮助。

    数据库审计系统在医院HIS数据库中的应用.docx

    数据库常遇到运行缓慢、死锁的问题,RG-DBS系列通过对SQL语句的延时分析,帮助优化数据库,从根本上解决问题。 数据库审计系统在医院HIS数据库中的应用全文共3页,当前为第2页。 数据库审计系统在医院HIS数据库中的...

    ORACLE数据库智能化管理系统2008演示

    10. 还在为查看数据库会话情况及死锁情况,想批量处理这些死锁及断开不必要空闲会话,一一处理而手功劳动吗? 11. 还在为日常数据处理分析,从查询结果中,求出任意选择行及数字型字段数据求合,而手工一行行、一列...

    关于Oracle数据库中的锁机制深入研究

    本文通过对Oracle数据库锁机制的研究,首先介绍了Oracle数据库锁的种类,并描述了实际应用中遇到的与锁相关的异常情况,特别对经常遇到的由于等待锁而使事务被挂起的问题进行了定位及解决,并对死锁这一比较严重的...

    SQL Server数据库事务锁的机制分析

    深入介绍了SQL Server的锁的机制,锁与事务隔离等级的关系及影响,分析了死锁的案例和解决方案。提出了锁的性能分析方法,分析并发性阻塞的问题和应用技巧。

    数据库系统安全的概念.doc

    一般而言,数据库的保密性和可用性是一对矛盾,对这一矛盾的分析与解决构成了 数据库系统的安全模型和一系列安全机制的主要目标。 ----------------------- 数据库系统安全的概念全文共3页,当前为第1页。 数据库...

    ORACLE数据库智能化管理系统2012

    还在为查看数据库会话情况及死锁情况,想批量处理这些死锁及断开不必要空闲会话,一一处理而手功劳动吗? 还在为日常数据处理分析,从查询结果中,求出可自定任意选择行及数字型字段数据求合,而手工一行行、一列列...

    基于Python实现用于实时监控和分析 MySQL 服务器的性能指标和相关信息工具源码

    死锁信息:mysqlstat 可以提供关于死锁的信息,帮助 DBA 了解并解决死锁问题。 索引分析:它可以查找重复或冗余的索引,帮助优化索引使用和减少存储空间的占用。 连接数统计:工具可以统计应用端 IP 的连接数总和,...

    《Sql Server 2008查询性能优化》扫描版-part1

    书 名: SQLServer2008查询性能优化 作 者:(美)弗里奇,(美)达姆 ,姚军 译 出版社: 人民邮电出版社 ...第13章 死锁分析 第14章 游标开销分析 第15章 数据库工作负载优化 第16章 SQL Server优化检查列表

    MySQL中由load data语句引起死锁的解决案例

    一个线上项目报的死锁,简要说明一下产生原因、处理方案和相关的一些点. 1、背景 这是一个类似数据分析的项目,数据完全通过LOAD DATA语句导入一个InnoDB表中。为方便描述,表结构简化为如下: Create table tb(id ...

Global site tag (gtag.js) - Google Analytics