Sybase数据库死锁对策
如何处理数据库中的死锁问题(五)
在开发和运维数据库系统的过程中,经常会遇到死锁问题。
死锁是指两个或多个进程在执行过程中,互相请求对方所持有的资源,同时又拒绝释放自己持有的资源,导致彼此都无法继续执行的情况。
如何处理数据库中的死锁问题成为数据库管理员和开发人员必须重视的一个方面。
1. 死锁问题的原因分析死锁问题主要是由于并发访问数据库中的共享资源时,对资源先后次序的控制不当引起的。
当多个进程需要同时访问同一个资源时,通过资源锁机制来保证数据的一致性和完整性。
然而,如果没有良好的资源访问控制策略,就容易导致死锁问题的发生。
2. 死锁问题的识别为了解决死锁问题,首先需要能够识别出死锁的存在。
数据库系统通常会提供一些工具和机制来帮助识别死锁,如死锁检测器。
死锁检测器可以追踪资源的分配和请求情况,以及进程的等待关系,并根据这些信息判断是否存在死锁。
3. 死锁问题的解决方法一旦识别出死锁问题的存在,就需要采取相应的解决方法来消除死锁。
以下是一些常用的死锁解决方法:a. 死锁超时机制死锁超时机制是一种简单但有效的解决方法。
当进程在一定时间内无法获得所需资源时,可以通过设置超时时间来主动放弃并重新尝试获取资源,以避免长时间的无谓等待。
b. 死锁检测与恢复死锁检测与恢复是一种较为复杂但比较全面的解决方法。
通过定期或实时地检测死锁的存在,然后采取相应的恢复策略。
常见的恢复策略有终止进程、回滚事务等。
c. 死锁预防死锁预防是一种在设计数据库系统时就考虑和解决死锁问题的方法。
通过合理的资源分配策略、避免不必要的资源竞争等手段来预防死锁的发生。
d. 死锁避免死锁避免是基于资源请求的动态分配的原则,根据当前系统状态和资源请求情况,通过预测资源请求的未来走向来避免潜在的死锁。
这需要对系统状态和资源请求进行动态调整和优化。
4. 其他注意事项处理数据库中的死锁问题还需要注意以下几个方面:a. 优化数据库设计合理的数据库设计在很大程度上可以减少死锁问题的发生。
通过合理的表和索引设计,可以降低并发事务对同一资源的竞争。
数据库的并发控制与死锁解决方案
数据库的并发控制与死锁解决方案随着科技的快速发展和互联网的普及,大量的数据被应用程序所处理和存储。
为了提高数据库的处理能力和运行效率,数据库系统引入了并发控制的技术。
并发控制是指在数据库系统中允许多个用户同时访问同一个数据库的能力,但同时又需要保证数据的一致性、完整性和准确性。
在并发控制的过程中,会出现一种称为死锁的情况。
死锁是指两个或多个事务互相等待对方释放所持有的资源,导致进程无法继续执行而进入死循环的状态。
死锁的出现会影响数据库系统的性能,并且会导致事务被阻塞无法完成。
为了解决并发控制和死锁的问题,数据库系统提供了以下几种解决方案:1. 锁机制:锁是并发控制中最常用的一种解决方案。
在数据库中,锁可以分为共享锁和排它锁。
共享锁允许多个事务读取同一资源,而排它锁则只允许一个事务对资源进行读写操作。
通过对资源施加合适的锁,可以保证数据库的数据一致性和完整性。
2. 事务隔离级别:数据库系统中提供了四个事务隔离级别,分别是读未提交、读已提交、可重复读和串行化。
选择合适的事务隔离级别可以避免一些并发带来的问题。
例如,在读未提交的隔离级别下,一个事务可以读取到其他事务尚未提交的数据,可能造成脏读的问题。
而在串行化的隔离级别下,每个事务都必须按照先后顺序依次执行,避免了并发带来的问题,但也牺牲了性能。
3. 死锁检测和死锁解除:数据库系统可以通过死锁检测来发现死锁的存在。
一旦发现死锁,系统可以采取多种方式来解除死锁。
常见的解除死锁的方法有回滚事务、终止阻塞的事务或者优化锁的分配策略。
通常情况下,数据库系统会根据一定的死锁检测算法来选择合适的死锁解除策略。
4. 优化数据库设计:合理的数据库设计也可以减少并发带来的问题。
例如,使用合适的索引和优化查询语句,可以减少数据库的锁冲突。
此外,可以将大表进行分区或分片存储,使得并发操作分散到多个节点上,减少锁冲突的可能性。
总之,数据库的并发控制和死锁解决方案是一个复杂且关键的问题。
造成数据库表死锁的原因分析及解决方案
造成数据库表死锁的原因分析及解决⽅案在联机事务处理(OLTP)的数据库应⽤系统中,多⽤户、多任务的并发性是系统最重要的技术指标之⼀。
为了提⾼并发性,⽬前⼤部分RDBMS都采⽤加锁技术。
然⽽由于现实环境的复杂性,使⽤加锁技术⼜不可避免地产⽣了死锁问题。
因此如何合理有效地使⽤加锁技术,最⼩化死锁是开发联机事务处理系统的关键。
⼀、死锁产⽣的原因在联机事务处理系统中,造成死机主要有两⽅⾯原因。
⼀⽅⾯,由于多⽤户、多任务的并发性和事务的完整性要求,当多个事务处理对多个资源同时访问时,若双⽅已锁定⼀部分资源但也都需要对⽅已锁定的资源时,⽆法在有限的时间内完全获得所需的资源,就会处于⽆限的等待状态,从⽽造成其对资源需求的死锁。
另⼀⽅⾯,数据库本⾝加锁机制的实现⽅法不同,各数据库系统也会产⽣其特殊的死锁情况。
如在Sybase SQL Server 11中,最⼩锁为2K⼀页的加锁⽅法,⽽⾮⾏级锁。
如果某张表的记录数少且记录的长度较短(即记录密度⾼,如应⽤系统中的系统配置表或系统参数表就属于此类表),被访问的频率⾼,就容易在该页上产⽣死锁。
⼆、容易发⽣死锁的⼏种情况如下:1、不同的存储过程、触发器、动态SQL语句段按照不同的顺序同时访问多张表;2、在交换期间添加记录频繁的表,但在该表上使⽤了⾮群集索引(non-clustered);3、表中的记录少,且单条记录较短,被访问的频率较⾼;4、整张表被访问的频率⾼(如代码对照表的查询等)。
三、以上死锁情况的对应解决⽅案1、在系统实现时应规定所有存储过程、触发器、动态SQL语句段中,对多张表的操作总是使⽤同⼀顺序。
如:有两个存储过程proc1、proc2,都需要访问三张表zltab、z2tab和z3tab,如果proc1按照zltab、z2tab和z3tab的顺序进⾏访问,那么,proc2也应该按照以上顺序访问这三张表。
2、对在交换期间添加记录频繁的表,使⽤群集索引(clustered),以减少多个⽤户添加记录到该表的最后⼀页上,在表尾产⽣热点,造成死锁。
引发Sybase数据库死锁的常见误区
图 1 两 个 串行 化 事 务
的 误 区 来 自技 术 层 面 。 事 实 上 技 术 层 面 出现 死 锁 一 般 是 设 计 不 当 造 成 的 。
2 误 区二 :处理顺 序相同不会产 生死锁 .
第 一 个 认 知 误 区 比 较 容 易 理 解 ,业 务 处 理 顺 序 发 生 冲
串行 化 事 务 是 保 障 事 务 完 整 性 的 必 要 条 件 .但 它 并 不 能 防 止 死 锁 ,比 如 图 1 示 的 两个 事 务 。 所
虽然 事务A和事务B 都是 串行化处 理事务 .但 由于 二者 锁定 临界资源 顺序 发生冲 突 .从而 形成死 锁链 ,这种情 况
然后分别开启两个事务 ,它们的执行顺序如图2 所示。 显然事务 A和事务B 的业务 处理顺序 一样 ,但是 照样会 出现死 锁 ,其 原 因在于 它们 的逻辑 处理 顺序相 互冲 突 这
不 了新 记 录 。 具体 步骤 如 图 3 示 。 所
可 以看 出 ,采 用 下 一 键 锁 机 制 可 以 避 免 出现 幻 读 ,但 是 ,事 务 A和 事 务 B 可 能 不 总 是 按 照 上 面 描 述 的 过 程 执 行 .事 务 A和 事 务 B 全 可 能 会 同 时 执 行 完 各 自第 二 步 完 图2 处 理 顺 序 相 同 的 两 事 务 执 行 顺 序 中 的 aJ步 .接 着 事 务 A执 行 bJ步 时 将 会 / \ / \ 出现 这 种 可 能 :事 务 A 求 共 享 锁 定 事 务 B 要 样 的逻 辑 死 锁 只 能 从 设 计 角度 上加 以修 改 。 插 入 记 录 所 属 的 数 据 页 .而 事 务 B 求 下 一 键 锁 .从 而 发 生 要
在 引发死 锁的认 知层面 上 目前有许 多常见 的错误 认 识 。有的是 非技术 层面 的 ,比如认 为程序 设计不 必对 死锁
数据库死锁问题及解决方法
数据库死锁问题及解决⽅法什么是数据库死锁每个使⽤关系型数据库的程序都可能遇到数据死锁的情况。
理解什么是死锁之前先要了解锁定的概念:如果需要“修改”⼀条数据,⾸先数据库管理系统会在上⾯加锁,以保证在同⼀时间只有⼀个事务能进⾏修改操作。
锁定(Locking)发⽣在当⼀个事务获得对某⼀资源的“锁”时,这时,其他的事务就不能更改这个资源了,这种机制的存在是为了保证数据⼀致性。
多数情况下,可以认为如果⼀个资源被锁定,它总会在以后某个时间被释放。
⽽死锁发⽣在当多个进程访问同⼀数据库时,其中每个进程拥有的锁都是其他进程所需的,由此造成每个进程都⽆法继续下去。
简单的说,进程A等待进程B释放他的资源,B⼜等待A释放他的资源,这样就互相等待就形成死锁。
导致数据库死锁的原因⼀般情况只发⽣锁超时,就是⼀个进程需要访问数据库表或者字段的时候,另外⼀个程序正在执⾏带锁的访问(⽐如修改数据),那么这个进程就会等待,当等了很久锁还没有解除的话就会锁超时,报告⼀个系统错误,拒绝执⾏相应的SQL操作。
发⽣死锁的情况⽐较少,⽐如⼀个进程需要访问两个资源(数据库表或者字段),当获取⼀个资源的时候进程就对它执⾏锁定,然后等待下⼀个资源空闲,这时候如果另外⼀个进程也需要两个资源,⽽已经获得并锁定了第⼆个资源,那么就会死锁,因为当前进程锁定第⼀个资源等待第⼆个资源,⽽另外⼀个进程锁定了第⼆个资源等待第⼀个资源,两个进程都永远得不到满⾜。
数据库死锁的解决⽅案use master --必须在master数据库中创建2go34if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_lockinfo]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)5drop procedure [dbo].[p_lockinfo]6GO78/**//*--处理死锁910 查看当前进程,或死锁进程,并能⾃动杀掉死进程1112 因为是针对死锁的,所以如果有死锁进程,只能查看死锁进程13 当然,你可以通过参数控制,不管有没有死锁,都只查看死锁进程1415 感谢: caiyunxia,jiangopen 两位提供的参考信息1617--邹建 2004.04(引⽤请保留此信息)--*/1819/**//*--调⽤⽰例2021 exec p_lockinfo22--*/23create proc p_lockinfo24@kill_lock_spid bit=1, --是否杀掉死锁的进程,1 杀掉, 0 仅显⽰25@show_spid_if_nolock bit=1 --如果没有死锁的进程,是否显⽰正常进程信息,1 显⽰,0 不显⽰26as27set nocount on28declare @count int,@s nvarchar(1000),@i int29selectid=identity(int,1,1),标志,30 进程ID=spid,线程ID=kpid,块进程ID=blocked,数据库ID=dbid,31 数据库名=db_name(dbid),⽤户ID=uid,⽤户名=loginame,累计CPU时间=cpu,32 登陆时间=login_time,打开事务数=open_tran, 进程状态=status,33 ⼯作站名=hostname,应⽤程序名=program_name,⼯作站进程ID=hostprocess,34 域名=nt_domain,⽹卡地址=net_address35into #t from(36 select 标志='死锁的进程',37spid,kpid,a.blocked,dbid,uid,loginame,cpu,login_time,open_tran,38status,hostname,program_name,hostprocess,nt_domain,net_address,39 s1=a.spid,s2=040 from master..sysprocesses a join (41 select blocked from master..sysprocesses group by blocked42 )b on a.spid=b.blocked where a.blocked=043 union all44 select '|_牺牲品_>',45 spid,kpid,blocked,dbid,uid,loginame,cpu,login_time,open_tran,46status,hostname,program_name,hostprocess,nt_domain,net_address,47 s1=blocked,s2=148 from master..sysprocesses a where blocked<>049)a order by s1,s25051select@count=@@rowcount,@i=15253if @count=0 and @show_spid_if_nolock=154begin55 insert #t56 select 标志='正常的进程',57spid,kpid,blocked,dbid,db_name(dbid),uid,loginame,cpu,login_time,58open_tran,status,hostname,program_name,hostprocess,nt_domain,net_address59 from master..sysprocesses60 set @count=@@rowcount61end6263if @count>064begin65 create table #t1(id int identity(1,1),a nvarchar(30),b Int,EventInfo nvarchar(255))66 if@kill_lock_spid=167 begin68 declare @spid varchar(10),@标志 varchar(10)69 while@i<=@count70 begin71 select @spid=进程ID,@标志=标志 from #t where id=@i72 insert #t1 exec('dbcc inputbuffer('+@spid+')')73 if @@rowcount=0 insert #t1(a) values(null)74 if @标志='死锁的进程' exec('kill '+@spid)75 set @i=@i+176 end77 end78 else79 while @i<=@count80 begin81 select @s='dbcc inputbuffer('+cast(进程ID as varchar)+')' from #t where id=@i82 insert #t1 exec(@s)83 if @@rowcount=0 insert #t1(a) values(null)84 set @i=@i+185 end86 select a.*,进程的SQL语句=b.EventInfo87 from #t a join #t1 b on a.id=b.id88 order by 进程ID89end90set nocount off91go。
数据库表锁死的解决方法
数据库表锁死的解决方法
数据库表锁死通常是指表级别的锁被占用,其他表中的数据无法访问的情况。
常见的解决方法有以下几种:
1. 重试锁:在锁定期间,可以不断地尝试获取锁,直到成功获取锁为止。
这种方法可以强制释放被占用的锁,使得其他表可以访问到受影响的数据。
2. 并发锁:将锁分配给并发事务,以便多个事务同时访问同一个表时,可以使用并发锁来避免竞争条件。
但是,这种方法可能会降低性能,因为多个事务需要同时等待锁。
3. 数据库级别的锁定限制:在数据库中设置锁定限制,使得可以限制对同一表的锁定时间或锁定数量等。
这种方法可以更加精确地控制锁的使用,避免锁死的问题。
4. 数据库操作日志:记录数据库操作日志,以便在出现锁死问题时,可以追溯锁定的来源和原因。
通过分析操作日志,可以找到锁死的根本原因,并采取相应的措施解决。
5. 数据库性能优化:优化数据库的性能和架构,降低锁的使用,减少锁死的可能性。
需要注意的是,解决锁死问题需要根据具体情况进行综合考虑,采取多种方法的组合来解决。
同时,解决锁死问题也需要遵守锁的使用规范,避免锁的使用不当导致锁死的问题。
数据库事务处理中的死锁与阻塞解决方案
数据库事务处理中的死锁与阻塞解决方案在数据库系统中,事务是指一组操作被视为一个不可分割的工作单位,它要么完全执行,要么完全不执行。
然而,复杂的事务处理环境中,常常会出现死锁和阻塞的问题。
本文将介绍数据库事务处理中死锁和阻塞的原因,并提供一些解决方案。
一、死锁死锁是指两个或多个事务互相请求对方所持有的资源,而导致所有事务无法继续执行的状态。
死锁的发生通常由于以下四个必要条件同时满足而产生:1. 互斥条件:每个资源只能由一个事务占用;2. 非抢占条件:事务不能抢占已被其他事务占用的资源;3. 占用且等待条件:事务在等待其他事务所持有的资源同时继续持有已占用的资源;4. 循环等待条件:存在一个资源占用的循环等待链。
解决死锁问题的常用方法包括死锁检测与死锁恢复。
1. 死锁检测:使用图论中的“循环检测”算法,根据已占用和等待的资源情况,在资源依赖图中检测循环链路。
一旦发现死锁,可以通过终止部分事务,使其他事务继续执行来解开死锁。
2. 死锁恢复:死锁恢复的方法有撤销(回滚)事务和使用死锁预防技术,如超时机制和死锁检测与恢复算法。
撤销(回滚)事务是指中止并撤销某些事务的操作,以解开死锁。
超时机制是指设置一个事务等待资源的最长时间,若超过该时间则主动放弃该事务以避免死锁。
死锁检测与恢复算法是一套专门处理死锁问题的算法,可以在发现死锁时选择牺牲少数事务,使其他事务可以继续执行。
二、阻塞阻塞是指一个事务无法执行下一步操作,因为所请求的资源被其他事务占用。
阻塞的产生可能是由于资源短缺或事务运行顺序不当引起。
解决阻塞问题的主要方法包括资源预分配和事务调度技术。
1. 资源预分配:为了避免出现由于资源不足而导致的阻塞问题,可以在事务开始前预先分配所有需要的资源。
这样可以消除潜在的资源竞争,提高系统的并发性。
但是,预分配资源可能导致资源的浪费和空间的占用。
2. 事务调度技术:采用某种策略对事务的顺序进行调度,优化资源的利用,避免阻塞。
如何处理数据库中的死锁问题(一)
处理数据库中的死锁问题在数据库管理系统中,死锁是一种常见的问题,它指的是两个或多个事务无限期地等待对方持有的资源,导致系统无法继续进行下去。
解决死锁问题是数据库管理人员和开发人员必须面对和解决的挑战之一。
本文将介绍如何处理数据库中的死锁问题。
一、了解死锁的原因和类型在解决数据库中的死锁问题之前,我们首先需要了解死锁的原因和类型。
死锁通常发生在并发事务环境中,其中每个事务都需要访问共享资源。
出现死锁的原因可以归结为以下几点:资源竞争、事务顺序死锁和事务等待。
在资源竞争中,多个事务同时请求相同的资源,但只能有一个事务能够成功获取该资源,其他事务必须等待。
当多个事务出现循环的资源请求关系时,便会形成事务顺序死锁。
事务等待则是指事务 A 等待事务 B 持有的资源,同时事务 B 又等待事务 A 持有的资源。
二、使用事务和锁机制为了避免死锁问题的发生,我们可以使用事务和锁机制。
事务是数据库管理系统中的一组操作,这些操作一起执行或一起失败。
通过使用事务,我们可以减少事务之间的竞争,从而减少死锁的可能性。
在事务中,锁是一种重要的机制,用于控制对共享资源的访问。
我们可以使用排他锁(Exclusive Lock)和共享锁(Shared Lock)来保护资源。
排他锁允许一个事务独占地访问资源,而共享锁允许多个事务共享访问资源。
在设计数据库模式时,我们可以通过良好的索引设计来减少死锁的可能性。
合理的索引设计可以减少资源竞争,提高事务的并发性。
三、使用超时机制和重试策略另一种处理数据库中的死锁问题的方法是使用超时机制和重试策略。
当一个事务等待超过一定的时间后,我们可以判断该事务可能陷入了死锁,并取消该事务的执行。
通过设置合理的超时时间,我们可以减少死锁对系统性能的影响。
此外,重试策略也是一个有效的处理死锁问题的方法。
当一个事务因为死锁而失败时,我们可以将其标记为失败并稍后重试。
通过重试策略,我们可以在多次尝试之后成功完成事务的执行,从而避免死锁的发生。
如何处理数据库中的死锁问题(三)
死锁是数据库中常见的问题之一,当多个事务同时占用资源并且互相等待时,就会出现死锁。
它会导致系统无法正常运行,因此必须及时解决。
本文将讨论如何处理数据库中的死锁问题。
一、了解死锁的原因和类型死锁的出现是由于事务之间的互相等待资源造成的。
常见的死锁类型有互斥型死锁、循环等待死锁、不可抢占死锁和资源剥夺死锁。
了解死锁的原因和类型对于解决死锁问题非常重要。
二、使用事务的并发控制机制数据库管理系统提供了一些并发控制机制,如封锁机制、时间戳机制和并发控制表等,用于协调多个事务对资源的访问。
我们可以使用这些机制来预防和检测死锁的发生。
其中,封锁机制是最常用的一种方法,可以通过加锁和解锁操作来控制资源的访问。
三、合理设计数据库模型和事务合理的数据库设计和事务设计可以减少死锁的发生。
在设计数据库模型时,应尽量避免长时间占用资源的操作,避免事务之间的互相等待。
另外,事务应该尽可能短小,减少对资源的占用时间,从而降低死锁的可能性。
四、监控和诊断死锁问题数据库管理系统通常提供了死锁监控和诊断工具,可以帮助我们及时发现和解决死锁问题。
通过监控工具,可以实时查看数据库中的死锁情况,并根据诊断结果采取相应的措施解锁。
五、使用死锁处理算法当发生死锁时,一种常见的解决办法是使用死锁处理算法。
常见的死锁处理算法有超时机制、抢占技术和死锁检测/恢复机制。
超时机制是指当某个事务等待时间过长时,系统自动取消该事务的锁定并回滚事务。
抢占技术是指系统自动取消某个事务的锁定,将资源分配给其他事务。
死锁检测/恢复机制是通过检测死锁并回滚其中一个或多个事务来解决死锁问题。
六、优化数据库性能另一个减少死锁的方法是优化数据库性能。
通过合理的索引设计、查询优化和内存管理,可以提高数据库的并发性能,减少事务之间的互相等待,从而降低死锁的可能性。
七、合理分配硬件资源死锁问题除了和数据库设计和事务处理有关外,还与硬件资源的分配有关。
如果使用的硬件资源不足,容易出现死锁问题。
数据库死锁的检测与解决策略(八)
数据库死锁的检测与解决策略一、引言在现代技术日益发展的时代,数据库系统已经广泛应用于各行各业中。
然而,由于数据库系统的并发操作特性,死锁问题成为了数据库性能和可靠性的一个重要挑战。
本文将探讨数据库死锁的检测与解决策略,帮助读者了解并解决这一问题。
二、死锁的概念与原因死锁是指两个或多个事务彼此之间因为争夺资源而陷入无限等待的状态。
当多个事务同时请求锁,并且占用了其他事务所需的资源,就可能会出现死锁。
数据库中常见的死锁原因包括不合理的事务并发控制、资源竞争等。
三、死锁的检测方法1. 等待图等待图是检测死锁的一种常用方法。
根据事务之间的资源请求关系和占用关系,构建一个图结构,若该图中存在一个环路,则说明发生了死锁。
通过对等待图进行深度遍历,可以及时发现死锁的存在。
2. 死锁检测算法除了等待图方法外,还有一些死锁检测算法可以辅助检测死锁。
常见的算法包括资源分配图算法、银行家算法等。
这些算法都通过模拟事务请求和释放资源的过程,来分析是否存在死锁的可能性。
四、死锁的解决策略1. 死锁预防死锁预防是通过合理的设计和规划,最大程度地避免死锁的发生。
具体措施包括事务顺序加锁、资源有序分配以及事务超时机制等。
在实际应用中,合理预防和规避死锁是最简单且有效的解决策略。
2. 死锁检测与回滚当无法预防死锁时,死锁检测与回滚策略是解决死锁问题的一种方法。
通过实时监测事务间的锁冲突情况,并及时识别死锁的发生,然后选择合适的事务回滚策略,可以有效地解决死锁问题。
3. 死锁超时机制为了避免死锁的持续存在,可以引入死锁超时机制。
即当一个事务等待锁的时间超过预设的阈值时,系统会自动中断该事务并回滚。
通过设置合理的超时时间,可以有效减少死锁的持续时间,提高数据库系统的可用性。
五、案例分析以一个在线购物系统为例,当多个用户同时购买某一商品时,系统需要处理并发的订单请求,可能会出现死锁问题。
在这种情况下,可以通过事务超时机制和死锁检测与回滚策略来解决死锁。
Sybase中的锁及死锁问题
Sybase中的锁及死锁问题一般来说,数据库都会有两种锁:内存锁和对象锁。
Oracle中有latch和lock,sybase中有spinlock和lock。
内存锁实际上就是数据库系统将自己管理的内存区按单元加锁,以防止一个任务在使用时被另一个任务修改。
用完这个内存单元后,内存锁被立即释放。
不过这简单说明一下这张表:比如共享锁和更新锁兼容,就是说加了共享锁,还可以加更新锁;排他锁和更新锁不兼容,就是说加了排他锁,就不可以再加更新锁。
这里可以看到,加了排他锁后,就不能再加任何锁了。
2锁方案:锁方案有三类:Allpages、Datapages、Datarows。
Allpages:全页锁,这里全页的意思是包括索引页和数据页。
Datapages:数据页锁,设置这种锁方案后,只会对数据页加锁。
Datarows:数据行锁,设置这种锁方案后,只会对数据行加锁。
这里可以看到,Datapages和Datarows只会对数据加锁,不会对数据相对应的索引加锁。
有了锁方案的概念,就好理解排他表锁、排他页锁、排他行锁的含义了。
比如:锁方案为Datarows,则会对表加XX行锁(XX可以是排他、共享或者更新);锁方案为Allpages或Datapages,则会对表加XX页锁(XX可以是排他、共享或者更新)。
3意图锁和更新锁:这里将意图锁和更新锁单独列出来,原因是这两种锁只在某一个时机下才有,过了那个时机就没有了。
意图锁:它是一种表级锁,表示在一个数据页上获得一个共享锁或排他锁的意图。
意图锁可以防止其他事务在该数据页的表上获得排它锁。
它分为排他意图锁和共享意图锁。
更新锁:它是一种页级锁,它在一个更新操作开始时获得,当要修改这些页时,更新锁会升级为排它锁。
4各种操作的加锁过程:其实上面说的那么多,主要就是为了说明最开始列举的10个锁类型。
下面就谈谈这10个种类型的锁在实际操作中是如何加锁的。
4.1 假定锁方案为Allpages:4.1.1 insert操作:当向表中执行Insert操作时,会先在表上加一个排他意图锁,然后加上排他页锁。
解决Sybase数据库死锁
解决Sybase数据库死锁2005-10-19 17:29 ChinaUnix 我要评论(1)字号:T | T死锁的发生对系统的性能和吞吐量都有重要影响,经检测发现,管理信息系统的死锁主要是因为两个或多个线程(登录)抢占同一表数据资源。
AD:死锁的发生对系统的性能和吞吐量都有重要影响,经检测发现,管理信息系统的死锁主要是因为两个或多个线程(登录)抢占同一表数据资源。
引起长时间抢占同一资源不是因为我们需要处理的事务太复杂,时间太长,而往往是因为我们在前端应用程序对数据库作操作时忘了提交.本文介绍一种处理解决这种死锁的方法。
Sybase封锁原理数据共享与数据一致性是一对不可调和的矛盾,为了达到数据共享与数据一致,必须进行并发控制。
并发控制的任务就是为了避免共享冲突而引起的数据不一致。
Sybase SQL Server并发控制的方法是加锁机制(LOCKING)。
锁的类型可申请的锁已有的锁 S U XS ∨∨×U ∨××X ×××Sybase SQL Server有三种封锁类型:排它锁(exclusive lock,简称X锁);共享锁(share lock,简称S锁);更新锁(update lock,简称U锁)。
这三种锁的相容矩阵表如下:×:表示不兼容。
∨:表示兼容。
Sybase SQL Server是自动决定加锁类型的。
一般来说,读(SELECT)操作使用S锁,写(UPDATE,INSERT和delete)操作使用X锁。
U锁是建立在页级上的,它在一个更新操作开始时获得,当要修改这些页时,U锁会升级为X锁。
锁的力度SQL Server有两级锁:页锁和表锁。
通常页锁比表锁的限制更少(或更小)。
页锁对本页的所有行进行锁定,而表锁则锁定整个表。
为了减小用户间的数据争用和改进并发性,SQL Server 试图尽可能地使用页锁。
当SQL Server决定一个语句将访问整个表或表的大多数页时,它用表锁来提供更有效的锁定。
数据库事务管理中的死锁与解决方案
数据库事务管理中的死锁与解决方案在数据库管理系统中,事务是一组数据库操作的逻辑单位,为了保证数据的完整性和一致性,事务必须具备原子性、一致性、隔离性和持久性四个特性。
然而,在多用户并发访问数据库时,可能会出现死锁问题,即多个事务因为争夺资源而相互等待,导致系统无法继续执行。
本文将深入探讨数据库事务管理中的死锁问题,并提出一些解决方案。
一、死锁的概念与原因1. 概念:死锁是指两个或多个事务在执行过程中,因为争夺系统资源而造成的互相等待的现象,导致这些事务永远无法继续执行下去,从而陷入死循环。
2. 原因:死锁的产生主要是由于并发事务对资源的竞争造成的。
简单来说,当多个事务同时请求对方已经占有的资源时,就可能出现死锁。
二、死锁产生的条件为了产生死锁,必须满足以下四个条件,缺一不可:1. 互斥条件:一个资源同时只能被一个事务占有。
2. 请求与保持条件:一个事务占有了某个资源后,又请求其他事务占有的资源。
3. 不可剥夺条件:资源不能被强行剥夺,只能由占有者主动释放。
4. 循环等待条件:多个事务之间形成一个循环等待资源的关系。
三、常见的死锁解决方案1. 死锁检测与解除:死锁检测是指通过算法检测系统中是否存在死锁,一旦发现死锁的存在,就需要通过解除死锁来解决。
常见的死锁解除算法有:银行家算法、资源分配图算法等。
这些算法的核心思想是通过找出死锁的原因,然后选择一个牺牲者并解除其占有的资源,从而打破死锁的循环。
2. 超时机制:超时机制是指设置一个事务等待资源的时间上限,当超过这个时间上限后,系统会主动终止该事务,释放其占有的资源。
这样可以避免因为死锁而导致系统无法继续执行。
3. 死锁预防:死锁预防是通过在事务执行过程中采取一系列措施来预防死锁的发生。
常见的死锁预防措施包括:加锁顺序、资源有序分配、避免事务持有多个资源等。
通过合理规划事务的执行顺序和资源的分配,可以有效地减少死锁的产生。
4. 死锁避免:死锁避免是在事务执行之前,先进行资源分析,根据资源的需求和可用性来决定是否执行该事务,以避免可能导致死锁的事务被执行。
SYBASE数据库常见的问题总结
SYBASE 数据库常见问题总结SYBASE 数据库常见问题总结 (1)1. SYSLOGS日志满了进不了系统,如何清除日志启动系统 (1)2. 数据库日志损坏时重建日志启动数据库的解决办法 (2)3. 数据库处于可疑状态的解决方法 (3)4.Sybase系统崩溃了,没有备份,但设备文件还存在,如何恢复数据库? (5)5.不小心直接删除了日志的设备文件,如何恢复数据库? (7)6.sa密码忘记了导致isql -Usa -P******进不去怎么办? (8)7.关于sybase的配置-(数据库慢的请留意) (8)8.设备路径更改的方法 (10)9.dump文件load后数据库访问不了解决办法 (11)10.sybase数据库备份方案 (11)11.master数据库状态被置为-32768后的处理方法 (14)1. SYSLOGS日志满了进不了系统,如何清除日志启动系统业务系统数据库不能正常启动,对于这一类问题,我们按照如下步骤解决:第一步,启用allow updates to system tables,这样可以使具有系统管理员角色的用户能够改变系统表并可创建和修改系统表的存储过程,其中系统表包括master数据库中所有Sybase 提供的表以及用户数据库中所有以“sys”开头的表和在sysobjects表中其ID值小于或等于100的表。
系统表的不正确变更会导致数据库损坏和数据丢失,修改系统表时务必要使用begin transaction来保护数据库不受可能损坏数据库的错误影响,完成修改后应立即禁用allow updates to system tables。
1>sp_configure "allow update",12>go第二步,Adaptive Server中的每个数据库在sysdatabases中都有相应的一行,安装Adaptive Server后,master数据库、model数据库、sybsystemprocs和tempdb数据库在sysdatabases 中都将有相应的条目,如果已经安装审计功能,sybsecurity数据库也将在其中有相应的条目。
数据库死锁原因及解决办法(全)
数据库死锁原因及解决办法(全)死锁(Deadlock)所谓死锁:是指两个或两个以上的进程在执⾏过程中,因争夺资源⽽造成的⼀种互相等待的现象,若⽆外⼒作⽤,它们都将⽆法推进下去。
此时称系统处于死锁状态或系统产⽣了死锁,这些永远在互相等待的进程称为死锁进程。
由于资源占⽤是互斥的,当某个进程提出申请资源后,使得有关进程在⽆外⼒协助下,永远分配不到必需的资源⽽⽆法继续运⾏,这就产⽣了⼀种特殊现象死锁。
⼀种情形,此时执⾏程序中两个或多个线程发⽣永久堵塞(等待),每个线程都在等待被其他线程占⽤并堵塞了的资源。
例如,如果线程A锁住了记录1并等待记录2,⽽线程B锁住了记录2并等待记录1,这样两个线程就发⽣了死锁现象。
计算机系统中,如果系统的资源分配策略不当,更常见的可能是程序员写的程序有错误等,则会导致进程因竞争资源不当⽽产⽣死锁的现象。
锁有多种实现⽅式,⽐如,共享-排他锁,锁表,树形协议,时间戳协议等等。
锁还有多种粒度,⽐如可以在表上加锁,也可以在记录上加锁。
产⽣死锁的原因主要是:(1)系统资源不⾜。
(2)进程运⾏推进的顺序不合适。
(3)资源分配不当等。
如果系统资源充⾜,进程的资源请求都能够得到满⾜,死锁出现的可能性就很低,否则就会因争夺有限的资源⽽陷⼊死锁。
其次,进程运⾏推进顺序与速度不同,也可能产⽣死锁。
产⽣死锁的四个必要条件:(1)互斥条件:⼀个资源每次只能被⼀个进程使⽤。
(2)请求与保持条件:⼀个进程因请求资源⽽阻塞时,对已获得的资源保持不放。
(3)不剥夺条件:进程已获得的资源,在末使⽤完之前,不能强⾏剥夺。
(4)循环等待条件:若⼲进程之间形成⼀种头尾相接的循环等待资源关系。
这四个条件是死锁的必要条件,只要系统发⽣死锁,这些条件必然成⽴,⽽只要上述条件之⼀不满⾜,就不会发⽣死锁。
死锁的预防和解除:理解了死锁的原因,尤其是产⽣死锁的四个必要条件,就可以最⼤可能地避免、预防和解除死锁。
所以,在系统设计、进程调度等⽅⾯注意如何不让这四个必要条件成⽴,如何确定资源的合理分配算法,避免进程永久占据系统资源。
数据库事务管理中的死锁问题与解决方案
数据库事务管理中的死锁问题与解决方案在数据库中,事务是一组相关的操作,作为一个单个逻辑工作单元进行执行。
事务的执行需要满足ACID(Atomicity,Consistency,Isolation,Durability)特性,其中隔离性(Isolation)是其中非常关键的一个特性。
然而,在并发执行的环境中,隔离性可能会导致一种称为死锁的问题。
1. 死锁问题的定义死锁是指多个事务因为彼此互相等待所造成的一种互相阻塞的状态。
当多个事务意外地持有彼此需要的资源,并且由于无法获取到其他事务持有的资源而无法继续执行时,就会发生死锁。
死锁会破坏数据库中事务的作用,影响系统的性能和可靠性。
2. 死锁发生的原因死锁问题产生的原因主要是由于事务同时满足以下四个条件:- 互斥条件:一个资源每次只能被一个事务使用,即一次只能有一个事务对其进行加锁。
- 持有和等待条件:一个事务持有了一个资源的同时还请求获得其他事务持有的资源。
- 不可抢占条件:一个事务在持有资源的情况下,不能被其他事务抢占资源,只能自愿释放。
- 环路等待条件:存在一个等待链,使得每个事务都在等待下一个事务所持有的资源。
3. 示例案例分析假设有两个事务A和B,A事务在执行过程中锁住了资源1,并且等待B事务释放资源2,而B事务在执行过程中锁住了资源2,并且等待A事务释放资源1。
这样就产生了一个死锁状态,A事务无法继续执行直到资源2被释放,而B事务也无法继续执行直到资源1被释放。
4. 死锁的解决方案为了解决数据库事务管理中的死锁问题,可以采取以下的解决方案:4.1 死锁检测与回滚数据库系统可以周期性地检查是否发生了死锁。
当检测到死锁时,系统需要选择一个事务进行回滚,以解开死锁的状态。
选择哪个事务进行回滚通常是根据事务的重要性或者运行时间来进行权衡。
回滚操作可以通过撤销该事务所做的改变,释放所持有的资源来解开死锁。
4.2 顺序加锁顺序加锁是指在事务中对资源的访问按照统一的顺序进行加锁,以避免死锁的发生。
SYBASE数据库常见的问题总结
SYBASE 数据库常见问题总结SYBASE 数据库常见问题总结 (1)1. SYSLOGS日志满了进不了系统,如何清除日志启动系统 (1)2. 数据库日志损坏时重建日志启动数据库的解决办法 (3)3. 数据库处于可疑状态的解决方法 (5)4.Sybase系统崩溃了,没有备份,但设备文件还存在,如何恢复数据库? (8)5.不小心直接删除了日志的设备文件,如何恢复数据库? (13)6.sa密码忘记了导致isql -Usa -P******进不去怎么办? (15)7.关于sybase的配置-(数据库慢的请留意) (15)8.设备路径更改的方法 (19)9.dump文件load后数据库访问不了解决办法 (20)10.sybase数据库备份方案 (20)11.master数据库状态被置为-32768后的处理方法 (26)1. SYSLOGS日志满了进不了系统,如何清除日志启动系统业务系统数据库不能正常启动,对于这一类问题,我们按照如下步骤解决:第一步,启用allow updates to system tables,这样可以使具有系统管理员角色的用户能够改变系统表并可创建和修改系统表的存储过程,其中系统表包括master数据库中所有Sybase提供的表以及用户数据库中所有以“sys”开头的表和在sysobjects表中其ID值小于或等于100的表。
系统表的不正确变更会导致数据库损坏和数据丢失,修改系统表时务必要使用begin transaction来保护数据库不受可能损坏数据库的错误影响,完成修改后应立即禁用allow updates to system tables。
1>sp_configure "allow update",12>go第二步,Adaptive Server中的每个数据库在sysdatabases中都有相应的一行,安装Adaptive Server后,master数据库、model数据库、sybsystemprocs和tempdb数据库在sysdatabases中都将有相应的条目,如果已经安装审计功能,sybsecurity数据库也将在其中有相应的条目。
数据库死锁与并发问题的实践经验与解决方案
数据库死锁与并发问题的实践经验与解决方案随着数据库应用的广泛应用,数据库死锁与并发问题成为了不可忽视的挑战。
当多个用户同时访问数据库时,可能会出现死锁和并发问题,这会导致事务无法完成,系统性能下降甚至崩溃。
在本文中,我们将探讨数据库死锁和并发问题的实践经验和解决方案,帮助读者更好地理解和解决这些问题。
首先,我们将介绍数据库死锁的概念和原因。
在数据库中,死锁是指两个或多个事务相互等待对方释放资源的情况,从而导致所有事务都无法继续进行的状态。
死锁的原因通常是由于事务同时请求相同的资源并按照不同的顺序进行执行,导致资源的竞争。
当这种竞争无法解决时,就会导致死锁的出现。
为了解决数据库死锁问题,我们可以采取以下几种实践经验和解决方案。
首先,合理设计数据库的事务,并采用适当的事务隔离级别。
例如,可以采用较低的隔离级别来降低死锁发生的概率,但这同时也会增加数据不一致的风险。
其次,合理设置数据库锁定策略,避免长时间占用共享资源。
合理的锁定策略应该平衡事务的并发性和数据的一致性,减少死锁的发生。
另一个数据库的常见问题是并发问题。
当多个用户同时访问数据库时,可能会发生并发问题,例如更新丢失、脏读、不可重复读和幻读等。
这些问题的发生会导致数据的不一致性,并影响系统的稳定性和性能。
为了解决数据库的并发问题,我们可以采取以下实践经验和解决方案。
首先,合理设计数据库的结构和索引,以提高查询和更新的效率。
在设计数据库结构时,应该避免过多的冗余数据和复杂的关联关系,以减少并发操作的冲突。
其次,采用适当的并发控制机制,如行级锁、乐观并发控制和悲观并发控制。
行级锁可以在不同的事务之间提供更细的粒度,从而避免了不必要的锁定和冲突。
乐观并发控制假设冲突是少见的,尝试执行操作并处理冲突。
悲观并发控制则假设冲突是常见的,使用锁定机制来保证事务的一致性。
最后,合理设置数据库的缓存和缓冲区,以提高系统的性能和响应速度。
除了上述的实践经验和解决方案,还有一些其他的建议和技巧,可以帮助我们更好地处理数据库死锁和并发问题。
数据库事务管理中的死锁问题与解决方法
数据库事务管理中的死锁问题与解决方法引言:在数据库事务管理中,死锁问题是一种常见的情况,指的是两个或多个事务相互等待彼此释放资源的情况。
当发生死锁时,事务无法继续执行,系统性能下降甚至崩溃。
因此,合理的死锁解决方法对于确保数据库的正常运行至关重要。
本文将探讨死锁的原因,并介绍几种常见的死锁解决方法。
一、死锁问题的原因1.1 资源竞争数据库中的资源包括数据表、行、列、索引等。
当多个事务同时请求获取相同的资源时,就会产生资源竞争。
如果系统无法正确地管理这些竞争关系,就会导致死锁的发生。
1.2 事务交互在数据库事务管理中,事务必须按照一定的顺序执行。
但是,如果多个事务之间存在依赖关系,例如事务1需要事务2中的资源,而事务2又需要事务1中的资源,就会发生不符合序列要求的事务交互,进而引发死锁。
二、死锁的解决方法为了避免死锁的发生,数据库系统采用了多种机制来解决这个问题。
下面介绍几种常见的死锁解决方法。
2.1 死锁预防死锁预防是一种主动的死锁解决方法,旨在通过限制事务对资源的访问来预防系统进入死锁状态。
常见的死锁预防技术包括以下几种:2.1.1 严格的资源顺序方法该方法要求事务按照某种预定的顺序请求资源,从而避免死锁的发生。
系统为每个事务分配一个全局统一的资源顺序,事务只有在获取到当前资源及之前的所有资源才能继续执行。
这种方法可以保证资源请求的有序性,但是可能导致资源利用率较低。
2.1.2 超时方法超时方法是指为每个事务分配一个超时阈值,当事务在超过该阈值时仍未获得所需资源,则系统会自动终止该事务,释放其占用的资源。
这种方法可以避免死锁的发生,但可能导致事务被过早地终止,影响系统性能。
2.2 死锁检测和解除当死锁无法被预防时,系统可以使用死锁检测和解除机制来检测并解决死锁问题。
死锁检测一般通过构建资源等待图进行实现,而解锁则通过终止与死锁相关的一个或多个事务来解除死锁。
死锁检测和解除机制不会影响正常的事务执行,但会增加系统的开销。
数据库防止死锁的方法
数据库防止死锁的方法
在数据库管理系统中,死锁是一个常见的问题,它可能导致系统的性能下降甚至崩溃。
为了避免或减少死锁的产生,我们可以采取以下方法:
1. 锁定顺序:确保所有应用程序都按照相同的顺序请求和释放锁。
通过指定一个全局的锁定顺序,可以减少死锁的发生概率。
2. 死锁检测:数据库管理系统可以通过实时监控来检测死锁的发生。
一旦检测到死锁,系统可以选择终止某些事务以解除死锁,并向应用程序报告该问题。
死锁检测可以帮助我们及时识别和解决死锁问题。
3. 超时机制:设置事务超时时间,确保长时间未能获取到所需资源的事务能够被终止。
超时机制可以防止一个事务长时间占用资源而导致其他事务等待,从而减少死锁的发生。
4. 死锁预防:预防死锁的最有效方法是避免事务对资源的循环等待。
通过明确规定事务对资源的访问顺序,可以避免死锁的产生。
5. 死锁避免:可以通过资源预分配和动态资源管理来避免死锁。
系统可以使用资源预分配算法,根据事务对资源的请求情况来判断是否给予资源,并避免分配导致死锁可能发生的资源。
动态资源管理可以根据系统当前的资源使用情况,实时调整资源的分配策略,以避免死锁的发生。
总之,数据库死锁是一个需要引起重视的问题,通过合理的锁定顺序、死锁检测、超时机制、死锁预防和死锁避免等方法,我们可以有效地减少死锁的发生,提高数据库系统的性能和稳定性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Sybase 数据库死锁对策
死锁的发生对系统的性能和吞吐量都有重要影响,经检测发现,管理信息系统的死锁主要是因为两个或多个线程(登录)抢占同一表数据资源。
引起长时间抢占同一资源不是因为我们需要处理的事务太复杂,时间太长,而往往是因为我们在前端应用程序对数据库作操作时忘了提交.本文介绍一种处理解决这种死锁的方法。
Sybase 封锁原理
数据共享与数据一致性是一对不可调和的矛盾,为了达到数据共享与数据一致,必须进行并发控制。
并发控制的任务就是为了避免共享冲突而引起的数据不一致。
Sybase SQL Server 并发控制的方法是加锁机制(LOCKING ). 锁的类型
Sybase SQL Server 有三种封锁类型:排它锁(exclusive lock,简称X 锁);共享锁(share lock,简称S 锁);更新锁(update lock,简称U
锁)。
这三种锁的相容矩阵表如下:
×:表示不兼容。
∨:表示兼容。
Sybase SQL Server 是自动决定加锁类型的。
一般来说,
读(SELECT )操作使用S 锁,写(UPDATE,INSERT 和delete )操作使用X 锁。
U 它在一个更新操作开始时获得,当要修改这些页时,U 锁会升级为X 锁。
锁的力度
SQL Server 有两级锁:页锁和表锁。
通常页锁比表锁的限制更少(或更小)。
页锁对本页的所有行进行锁定,而表锁则锁定整个表。
为了减小用户间的数据争用和改进并发性,SQL Server 试图尽可能地使用页锁。
当SQL Server 决定一个语句将访问整个表或表的大多数页时,它用表锁来提供更有效的锁定。
锁定策略直接受查询方案约束,如果update 或delete 语句没有可用的索引,它就执行表扫描或请求一个表锁定。
如果update 或delete 语句使用了索引,它就通过请求页锁来开始,如果影响到大多数行,它就要请求表锁。
一旦一个语句积累的页锁超过锁提升阈值,SQL Server 就设法给该对象分配一个表锁。
如果成功了,页锁就不再必要了,因此被释放。
表锁也在页层提供避免锁冲突的方法。
对于有些命令SQL Server 自动使用表锁。
锁的状态
SQL SERVER 加锁有三种状态:
1)意向锁(intend )—是一种表级锁,它表示在一个数据页上获得一个S 或X 锁的意向。
意向锁可以防止其他事务在该数据页的表上获得排它锁。
2)阻塞(blocking,简记blk )—它表明目前加锁进程的状态,带有blk 后缀的锁说明该进程目前正阻塞另一个需要获得锁的进程,只有这一进程完成,其他进程才可以进行。
3)需求锁(demand )—表示此时该进程企图得到一个排它锁。
它可以防止 可申请的锁 已有的锁 S U X S ∨ ∨ × U ∨ × × X
× × ×
在这一表或页上加过多的S锁,她表示某一事务是下一个去锁定该表和该页的事务。
需求锁是一个内部过程,因此用sp_lock是无法看见的。
死锁DEADLOCK
简单地说,有两个用户进程,每个进程都在一个单独的页或表上有一个锁,而且每个进程都想在对方进程的页或表上请求不相容锁时就会发生“死锁”。
在这种情况下,第一个进程在等待另一进程释放锁,但另一进程要等到第一个进程的对象释放时才会释放自己的锁。
SQL Server检查是否死锁,并终止事务中CPU时间积累最小的用户(即最后进入的用户)。
SQL Server回滚该用户的事务,并用消息号1205通知有此死锁行为的应用程序,然后允许其他用户进程继续进行。
在多用户情形下,每个用户的应用程序都应检查每个修改数据的事务是否有1205号消息,以此确定是否有可能死锁。
消息号1025表示该用户的事务因死锁而终止并被回滚。
应用程序必须重新开始这个事务处理。
查找死锁原因
既然管理信息系统长时间死锁的原因是由于我们提交或者是提交不当,那么我们就可以通过修改程序防止出现死锁。
定位死锁出错处主要经过以下三步:1)在死锁出现时,用SP_WHO,SP_LOCK获得进程与锁的活动情况。
2)结合库表sysobjects和相应的操作员信息表查出被锁的库表与锁住别人的操作员。
3)根据锁定的库表与操作员的岗位,可以估计出程序大约出错处。
询问操作员在死锁时执行的具体操作即可完全定位出错处。
最后查找程序并修改之。
用sp_who获取关于被阻碍进程的信息
系统过程sp_who给出系统进程的报告。
如果用户的命令正被另一进程保持的锁阻碍,则:
◆status列显示“lock sleep”。
◆blk列显示保持该锁或这些锁的进程标识,即被谁锁定了。
◆lo giname列显示登录操作员。
结合相应的操作员信息表,便可知道操作员是谁。
Fid spid status loginame origname blk dbname cmd
0 1 lock sleep lm lm 18 QJYD SELECT
0 2 sleeping NULL NULL 0 master NETWORK HANDLER
0 3 sleeping NULL NULL 0 master NETWORK HANDLER
……
用sp_lock浏览锁
要得到关于当前SQL Server上保持的锁的报告,可用系统过程sp_lock [spid1[,spid2]],spid1,spid2是表master.dbo.sysprocesses中的sql server 进程id号,用sp_who可以得到锁定与被锁定的spid号:
◆locktype列显示加锁的类型和封锁的粒度,有些锁的后缀还带有blk表
明锁的状态。
前缀表明锁的类型:Sh—共享锁,Ex—排它锁或更新锁,中间表明锁死在表上(”table”或’intent’)还是在页上(page). 后缀“blk”表明该进程正在障碍另一个需要请求锁的进程。
一旦正在障碍的进程一结束,其他进程就向前移动。
“demand”后缀表明当前共享锁一释放,该进程就申请互斥锁。
◆table_id列显示表的id号,结合sysobjects即可查出被封锁的表名。
执行该进程后屏幕显示
Fid Spid locktype table_id page row dbname Class context
0 1 Sh_intent 678293476 0 0 QJYD Non Cursor LockFam dur
0 1 Sh_page 678293476 31764 0 QJYD Non Cursor Lock
0 18 Ex_intent 9767092 0 0 QJYD Non Cursor LockFam dur
……
定位出错处
根据sp_who与sp_lock命令的结果,结合sysobjects和相应的操作员信息表。
得到操作员及其在死锁时所操作的库表,便大约可以知道应用程序的出错处,再询问操作员在死锁时执行什么操作以进一步认证。
最后查找程序并修正之。