一、死锁的表现
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
相关推荐
总之,解决数据库死锁问题的三种方法各有优缺点,实际应用中应根据具体情况和需求选择最适合的策略。预防死锁虽能有效避免死锁的发生,但可能限制了资源的利用率;检测死锁虽然灵活性较高,但可能会增加系统的复杂性...
本文将深入探讨“sql数据库死锁查询工具”及其在解决数据库死锁和阻塞过程中的作用。 **1. SQL死锁** SQL死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉,它们都将无法...
HIS系统SQL Server数据库死锁问题的分析与解决 SQL Server数据库是HIS系统中非常重要的一部分,负责存储和管理大量的医疗数据。然而,在实际应用中,SQL Server数据库可能会出现死锁问题,导致系统性能下降, thậm...
通过对数据库死锁现象的深入分析,我们可以发现,正确处理资源竞争是避免死锁的关键。此外,合理设计事务逻辑、优化数据库结构以及提高SQL语句的执行效率,都是预防死锁的有效措施。在实际开发过程中,开发者应当...
标题所提及的"查看数据库死锁信息"是一个至关重要的任务,因为死锁可能导致数据库性能下降,甚至影响到服务的正常运行。当出现"Deadlock found when trying to get to lock; try restarting transaction"这样的错误...
对技术人员来说,了解并掌握数据死锁的成因及解决方法,将有助于提高Oracle数据库的性能与可靠性,保障企业的信息系统稳定运行。随着技术的不断进步,数据库管理系统也在持续优化,但不变的是技术人员的专业知识和...
通过对DB2死锁问题的深入分析与实践操作,我们可以有效地识别和解决这类问题。这不仅包括了对错误代码的理解、基本的解决步骤,还包括了更为高级的技术手段,如利用监控工具和日志分析来定位问题根源。通过上述方法...
### 解决Sybase数据库死锁 #### Sybase数据库死锁概述 死锁是数据库管理系统中一个常见的问题,尤其是在高并发的环境下更为突出。Sybase数据库中的死锁通常发生在两个或多个事务试图锁定相同的资源(如表或记录)时...
为了解决这个问题,"数据库死锁检测工具"应运而生,它能够帮助数据库管理员识别并解决这种现象,确保数据库系统的稳定运行。 死锁的四个必要条件: 1. 互斥:一个资源在任何时候只能被一个事务使用,其他事务必须...
Oracle数据库死锁是数据库系统中常见的问题,它发生在两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象。当这种情况发生时,如果没有外力干预,这些事务都将无法继续执行,形成一种僵局。了解如何...
2. **死锁的检测与解决**: - InnoDB存储引擎内置了死锁检测机制,当检测到死锁时,会终止一个事务,并返回错误信息(错误代码1213)。 - 用户可以通过`SHOW ENGINE INNODB STATUS;`命令查看死锁详情,找出死锁的...
通过对以上几个案例的分析,我们可以看出,数据库死锁的发生往往与事务处理逻辑、并发控制策略及数据访问模式密切相关。为了避免死锁,需要在设计阶段充分考虑这些因素,并采取相应的预防措施。此外,合理设计数据库...
#### 三、数据库死锁示例分析 根据给定的部分内容,我们可以构建一个简单的死锁场景: 1. **事务A** 首先获取了资源 **A** 的锁定。 2. **事务B** 随后获取了资源 **B** 的锁定。 3. 接下来,**事务A** 尝试获取...
HIS 系统中 SQL Server 数据库死锁问题的重要性不言而喻。深入分析和解决这个问题,对于保障HIS 系统的稳定运行、提高医疗...因此,本文将对 HIS 系统 SQL Server-数据库死锁问题进行深入分析,并提出有效的解决方法。
解决DB2数据库死锁的问题通常涉及以下几个步骤: 1. **死锁检测**:DB2系统内建了死锁检测机制,会在发现死锁时自动尝试解决。不过,管理员也可以通过监控工具主动检查。`db2top`是一个强大的DB2性能监控工具,通过...
然而,这只是解决死锁问题的第一步,实际操作中可能需要结合数据库架构设计、代码优化等多个方面进行综合分析和调整。 在提供的文件"sql server 死锁.wps"中,你可能会找到更具体的案例分析和解决方法,进一步加深...
9. **监控和日志记录**:通过SQL Server的系统日志或专门的工具监控死锁事件,记录死锁信息,以便分析死锁模式并针对性地调整应用程序或数据库配置。 总的来说,解决SQL Server中的死锁问题需要综合考虑数据库设计...
3. **禁用跟踪标志1204**:在完成死锁分析后,应使用`DBCC TRACEOFF(1204, -1)`命令关闭该跟踪标志,以避免不必要的系统资源消耗。 #### 分析死锁图 死锁图是死锁报告中最为直观的部分,它以图形的方式展示了死锁...
### 查看数据库死锁SQL 在数据库管理与优化过程中,处理死锁问题是非常重要的一个环节。死锁是指两个或更多的事务在等待对方释放资源时所形成的一种僵局状态,这会导致事务无法继续执行,严重影响数据库系统的性能...
#### 三、Oracle死锁检测与处理 Oracle数据库提供了一系列工具来帮助管理员检测和处理死锁。 ##### 3.1 死锁日志记录 当Oracle数据库检测到死锁时,会在警报日志文件(alert.log)中记录相关信息。这些信息对于分析...