SQL Server死锁的解决过程

某现场报一个SQL死锁,于是开启了1222跟踪:

dbcc traceon(1222,-1)

一段时间之后拷贝ERROR文件查找相关信息,比较有用的摘录出来如下:

语句一:

select study_iuid,station_aet,modality,accession_no,patient_fk,item_attrs,start_datetime
from worklist w WITH(readpast), mwl_item m
where w.TAG_STUDY_INSTANCE_UID=m.study_iuid
and isread=‘1‘ and (TAG_SPS_STATUS is null or TAG_SPS_STATUS=‘SCHEDULED‘ or TAG_SPS_STATUS=‘Discontinued‘)
and TAG_SPS_START_DATE between @P0 and @P1
and  not exists (select 1 from mpps b where b.study_iuid=m.study_iuid)

语句二:

INSERT INTO mwl_item (created_time, updated_time, sps_id, start_datetime, station_aet, station_name, modality, perf_physician, perf_phys_fn_sx, perf_phys_gn_sx, perf_phys_i_name, perf_phys_p_name, req_proc_id, accession_no, study_iuid, item_attrs, sps_status, patient_fk)
VALUES (@P0, @P1, @P2, @P3, @P4, @P5, @P6, @P7, @P8, @P9, @P10, @P11, @P12, @P13, @P14, @P15, @P16, @P17);

相关的死锁资源如下:

resource-list
 pagelock fileid=1 pageid=6996 dbid=8 objectname=Worklist.dbo.mwl_item id=lock19825c100 mode=IX associatedObjectId=72057594039697408
  owner-list
   owner id=process984d048 mode=IX
  waiter-list
   waiter id=process60e9708 mode=S requestType=wait
 pagelock fileid=1 pageid=11086 dbid=8 objectname=Worklist.dbo.mwl_item id=lock1b087b100 mode=S associatedObjectId=72057594039697408
  owner-list
   owner id=process60e9708 mode=S
  waiter-list
   waiter id=process984d048 mode=IX requestType=wait

可以明显的看到是select语句与insert语句产生了死锁,争用的资源分别6996和11086这两个page。

因此根据死锁的产生原理决定进行以下优化:

1.优化select语句使其尽快完成以减少死锁频率。

2.对select语句使用nolock选项以避免死锁问题。

3.通知开发优化相关代码的执行顺序来避免死锁问题。

最终优化了select语句,其他两条交给开发做修改。

 

时间: 2024-10-16 19:33:26

SQL Server死锁的解决过程的相关文章

SQL Server死锁产生原因及解决办法

SQL Server死锁产生原因及解决办法 2006-07-18 05:12:10 分类: SQL Server 其实所有的死锁最深层的原因就是一个:资源竞争 表现一: 一个用户A 访问表A(锁住了表A),然后又访问表B,另一个用户B 访问表B(锁住了表B),然后企图访问表A,这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B,才能继续,好了他老人家就只好老老实实在这等了,同样用户B要等用户A释放表A才能继续这就死锁了. 解决方法: 这种死锁是由于你的程序的BUG产生的,除了调整你的程序

Update导致SQL Server死锁的典型方法(转载)

此文为转载文章,描述的很好,没有验证过. 最近遇到了一个看上去很奇怪,分析起来很有意思的死锁问题.这个死锁看上去难以理解.而分析过程中,又使用了很多分析SQL Server死锁的典型方法.记录下来整个分析过程还是很有意义的. 问题重现步骤: 经过提炼,问题重现的步骤非常简单,在SQL 2008上可以很容易地重现. 1.         首先,创建一张表格,上面有一个clustered index,两个non-clustered index. create table tt(id int iden

Sql Server tempdb原理-启动过程解析实践

我们知道在SqlServer实例启动过程中数据库会进行还原(Redo,Undo)然后打开提供服务,但我们知道tempdb是不提供重做机制的(Redo)那tempdb是如何还原的呢?如果tempdb损坏我们该怎么办,这里我将通过实例给大家介绍. 有时tempdb因为一些原因会变得非常巨大,一些DBA的解决方式就是重启数据库实例,的确重启后tempdb就会恢复到初始设置大小,理由很简单tempdb会重新创建. Tempdb的创建过程. 1在model库打开后进行tempdb创建(可以日志中看到mod

SQL Server 死锁的告警监控

原文:SQL Server 死锁的告警监控 今天这篇文章总结一下如何监控SQL Server的死锁,其实以前写过MS SQL 监控错误日志的告警信息,这篇文章着重介绍如何监控数据库的死锁,当然这篇文章不分析死锁产生的原因.以及如何解决死锁.死锁(Dead Lock)的错误信息在sys.messages中的message_id为1205,可以使用下面SQL查看. SELECT * FROM sys.messages WHERE message_id=1205 那么接下来,我们来设置一下死锁(Dea

The database could not be exclusively locked to perform the operation(SQL Server 5030错误解决办法)(转)

Microsoft SQL Server 5030错误解决办法 今天在使用SQL Server时,由于之前创建数据库忘记了设置Collocation,数据库中插入中文字符都是乱码,于是到DataBase的Options中修改Collocation,出现了The database could not be exclusively locked to perform the operation这个错误,无法修改字符集为Chinese_PRC_90_CI_AS. 解决办法找了很久才找到,如下: 1.执

SQL Server内存不足解决,以及涉及到的知识点

首选,感谢博主shield-hand的一篇文章(ms sql server缓存清除与内存释放).写的非常细致.简洁.我这里并不是自己写博客,而是用自己的思维将众多博文或官网资料做一次整合.  在讲解问题发生原因之前,我先贴出来解决方案.之后再详细剖析其深层次的原因. ms sql server缓存清除与内存释放这篇文章已经给出了非常完美的方案,我就不再赘述了.有一个问题需要注意下,就是脚本操作中最好修个成以下形式: USE [IVMS8100] GO /****** Object: Stored

Sql Server 2000 在安装过程中跳过CD-Key的解决方案

Sql Server 2000 在安装过程中如何跳过 CD-Key 呢?来自云端网客的解决方案如下: 1. 运行"regedit"打开注册表. 2. 找到注册表分支 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager . 3. 将 SafeDLLSearchMode 这个 DWORD 的键值改为 0,如果没有的话就创建这个 DWORD 类型的键值. 4. 退出注册表. 操作完成后后就可以继续安装了.

转载 The database could not be exclusively locked to perform the operation(SQL Server 5030错误解决办法)

SQL Server 5030错误解决办法 今天在使用SQL Server时,由于之前创建数据库忘记了设置Collocation,数据库中插入中文字符都是乱码,于是到DataBase的Options中修改Collocation,出现了The database could not be exclusively locked to perform the operation这个错误,无法修改字符集为Chinese_PRC_90_CI_AS. 解决办法找了很久才找到,如下: 1.执行SQL ALTER

SQL Server死锁排查

1. 死锁原理 根据操作系统中的定义:死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态. 死锁的四个必要条件:互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用.请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源.非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺.循环等待条件(Circular wait):系统中若干进程组成