| Sybase数据库死锁应对方法 | ||
作者:北极圈 文章来源:本站整理 点击数: 更新时间:2008-6-25 17:02:48 |
||
|
死锁DEADLOCK 简单地说,有两个用户进程,每个进程都在一个单独的页或表上有一个锁,而且每个进程都想在对方进程的页或表上请求不相容锁时就会发生“死锁”。在这种情况下,第一个进程在等待另一进程释放锁,但另一进程要等到第一个进程的对象释放时才会释放自己的锁。 SQL Server检查是否死锁,并终止事务中CPU时间积累最小的用户(即最后进入的用户)。SQL Server回滚该用户的事务,并用消息号1205通知有此死锁行为的应用程序,然后允许其他用户进程继续进行。 在多用户情形下,每个用户的应用程序都应检查每个修改数据的事务是否有1205号消息,以此确定是否有可能死锁。消息号1025表示该用户的事务因死锁而终止并被回滚。应用程序必须重新开始这个事务处理。 查找死锁原因 既然管理信息系统长时间死锁的原因是由于我们提交或者是提交不当,那么我们就可以通过修改程序防止出现死锁。定位死锁出错处主要经过以下三步: 1)在死锁出现时,用SP_WHO,SP_LOCK获得进程与锁的活动情况。 用sp_who获取关于被阻碍进程的信息 系统过程sp_who给出系统进程的报告。如果用户的命令正被另一进程保持的锁阻碍,则: 用sp_lock浏览锁 ◆locktype列显示加锁的类型和封锁的粒度,有些锁的后缀还带有blk表明锁的状态。前缀表明锁的类型:Sh—共享锁,Ex—排它锁或更新锁,中间表明锁死在表上(”table”或’intent’)还是在页上(page). 后缀“blk”表明该进程正在障碍另一个需要请求锁的进程。一旦正在障碍的进程一结束,其他进程就向前移动。“demand”后缀表明当前共享锁一释放, 该进程就申请互斥锁。 ◆table_id列显示表的id号,结合sysobjects即可查出被封锁的表名。 执行该进程后屏幕显示 Fid Spid locktype table_id page row dbname Class context 定位出错处 根据sp_who与sp_lock命令的结果,结合sysobjects和相应的操作员信息表。得到操作员及其在死锁时所操作的库表,便大约可以知道应用程序的出错处,再询问操作员在死锁时执行什么操作以进一步认证。最后查找程序并修正之。 |
||
| 文章录入:admin 责任编辑:admin | ||
| 【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | ||