--死鎖
/******************************************************************************************************************************************************
死鎖指兩個以上事務相互阻塞相互等待對方釋放它們的鎖,SQL Server會通過回滾其中一個事務並返回一個錯誤來自已解決阻塞問題,讓其他事務完成它們的工作。整理人:中国风(Roy)日期:2008.07.20
******************************************************************************************************************************************************/set nocount on ;
if object_id('T1') is not nulldrop table T1
go
create table T1(ID int primary key,Col1 int,Col2 nvarchar(20))
insert T1 select 1,101,'A'
insert T1 select 2,102,'B'
insert T1 select 3,103,'C'
goif object_id('T2') is not nulldrop table T2
go
create table T2(ID int primary key,Col1 int,Col2 nvarchar(20))
insert T2 select 1,201,'X'
insert T2 select 2,202,'Y'
insert T2 select 3,203,'Z'go
生成表數據:
/*
T1:
ID          Col1        Col2
----------- ----------- --------------------
1           101         A
2           101         B
3           101         CT2:
ID          Col1        Col2
----------- ----------- --------------------
1           201         X
2           201         Y
3           201         Z
*/防止死鎖:
1、    最少化阻塞。阻塞越少,發生死鎖機會越少
2、    在事務中按順序訪問表(以上例子:死鎖2)
3、    在錯誤處理程式中檢查錯誤1205並在錯誤發生時重新提交事務
4、    在錯誤處理程式中加一個過程將錯誤的詳細寫入日誌
5、    索引的合理使用(以上例子:死鎖1、死鎖3)
當發生死鎖時,事務自動提交,可通過日誌來監視死鎖死鎖1(索引):
--連接窗口1
--1步:
begin tranupdate t1 set col2=col2+'A' where col1=101--3步:select * from t2 where col1=201
commit tran--連接窗口2--2步:
begin tranupdate t2 set col2=col2+'B' where col1=203--4步:select * from t1 where col1=103
commit tran--連接窗口1:收到死鎖錯誤,連接窗口2得到結果:/*
訊息 1205,層級 13,狀態 51,行 3
交易 (處理序識別碼 53) 在 鎖定 資源上被另一個處理序鎖死並已被選擇作為死結的犧牲者。請重新執行該交易。
*/--連接窗口2:得到結果/*
----------- ----------- --------------------
3           103         C
*/處理方法:
--在t1、t2表的col1條件列建索引
create index IX_t1_col1 on t1(col1)
create index IX_t2_col1 on t2(col1)
go--連接窗口1
--1步:
begin tranupdate t1 set col2=col2+'A' where col1=101--3步:
select * from t2 with(index=IX_t2_col1)where col1=201    --因表數據少,只能指定索引提示才能確保SQL Server使用索引
commit tran--連接窗口2--2步:
begin tranupdate t2 set col2=col2+'B' where col1=203--4步:
select * from t1 with(index=IX_t1_col1) where col1=103    --因表數據少,只能指定索引提示才能確保SQL Server使用索引
commit tran--連接窗口1:
/*
ID          Col1        Col2
----------- ----------- --------------------
1           201         X(1 個資料列受到影響)*/
--連接窗口2
/*
ID          Col1        Col2
----------- ----------- --------------------
3           103         C(1 個資料列受到影響)
*/死鎖2(訪問表順序):--連接窗口1:
--1步:
begin tranupdate t1 set col1=col1+1 where ID=1--3步:
select col1 from t2 where ID=1
commit tran--連接窗口2:
--2步:
begin tranupdate t2 set col1=col1+1 where ID=1--4步
select col1 from t1 where ID=1
commit tran--連接窗口1:/*
col1
-----------
201(1 個資料列受到影響)
*/--連接窗口2:/*
col1
-----------
訊息 1205,層級 13,狀態 51,行 1
交易 (處理序識別碼 54) 在 鎖定 資源上被另一個處理序鎖死並已被選擇作為死結的犧牲者。請重新執行該交易。
*/處理方法:--改變訪問表的順序--連接窗口1:
--1步:
begin tranupdate t1 set col1=col1+1 where ID=1--3步:select col1 from t2 where ID=1
commit tran--連接窗口2:
--2步:
begin transelect col1 from t1 where ID=1--會等待連接窗口1提交
--4步update t2 set col1=col1+1 where ID=1
commit tran死鎖3(單表):--連接窗口1:while 1=1update T1 set col1=203-col1 where ID=2--連接窗口2:
declare @i  nvarchar(20)
while 1=1set @i=(select col2 from T1 with(index=IX_t1_col1)where Col1=102);--因表數據少,只能指定索引提示才能確保SQL Server使用索引--連接窗口1
/*
訊息 1205,層級 13,狀態 51,行 4
交易 (處理序識別碼 53) 在 鎖定 資源上被另一個處理序鎖死並已被選擇作為死結的犧牲者。請重新執行該交易。
*/處理方法:
1、刪除col1上的非聚集索引,這樣影響SELECT速度,不可取.drop index IX_t1_col1 on t1
2、建一個覆蓋索引A、drop index IX_t1_col1 on t1B、create index IX_t1_col1_col2 on t1(col1,col2)通過SQL Server Profiler查死鎖信息:啟動SQL Server Profiler——連接實例——事件選取範圍——顯示所有事件
選擇項:
TSQL——SQL:StmtStarting
Locks——Deadlock graph(這是SQL2005新增事件,生成包含死鎖信息的xml值)——Lock:DeadlockChain 死鎖鏈中的進程產生該事件,可標識死鎖進程的ID並跟蹤操作——Lock:Deadlock 該事件發生了死鎖

转载于:https://www.cnblogs.com/chear/p/3168874.html

分析死锁并处理_整理贴相关推荐

  1. 在线分析mysql死锁详解_记一次线上mysql死锁分析(一)

    记录一次比较诡异的mysql死锁日志.系统运行几个月来,就在前几天发生了一次死锁,而且就只发生了一次死锁,整个排查过程耗时将近一天,最后感谢我们的DBA大神和老大一起分析找到原因. 诊断死锁 借助于我 ...

  2. 详解SQL Server Profiler分析死锁几大步骤

    在两个或多个SQL Server进程中,每一个进程锁定了其他进程试图锁定的资源,就会出现死锁,例如, 进程process1对table1持有1个排它锁(X),同时process1对table2请求1个 ...

  3. 一个 Linux 上分析死锁的简单方法

    2019独角兽企业重金招聘Python工程师标准>>> 简介 死锁 (deallocks): 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无 ...

  4. java 分析java死锁_Java死锁示例–如何分析死锁情况

    java 分析java死锁 死锁是两个线程或多个线程永远被阻塞的编程情况,这种情况发生在至少两个线程和两个或更多资源的情况下. 在这里,我编写了一个简单的程序,它将导致死锁情况,然后我们将看到如何对其 ...

  5. Java死锁示例–如何分析死锁情况

    死锁是两个或多个线程永远被阻塞的编程情况,这种情况发生在至少两个线程和两个或更多资源的情况下. 在这里,我编写了一个简单的程序,该程序将导致死锁情况,然后我们将看到如何对其进行分析. Java死锁示例 ...

  6. 数据可视化分析票房数据报告_票房收入分析和可视化

    数据可视化分析票房数据报告 Welcome back to my 100 Days of Data Science Challenge Journey. On day 4 and 5, I work ...

  7. sqlserver 抓取所有执行语句 SQL语句分析 死锁 抓取

    sqlserver 抓取所有执行语句 SQL语句分析 死锁 抓取 原文:sqlserver 抓取所有执行语句 SQL语句分析 死锁 抓取 在多人开发中最头疼的是人少事多没有时间进行codereview ...

  8. 几种常见的网络摄像头_DVR方案_整理

    几种常见的网络摄像头_DVR方案_整理 http://blog.csdn.net/ex_net/article/details/7833334 作者:张建波 邮箱: 281451020@qq.com ...

  9. 死锁概念?如何分析死锁和避免死锁?

    什么是死锁?如何分析死锁和避免死锁? 死锁就是在多线程运行时,线程对象在获取操作资源时,操作资源被其他线程对象占用而获取不到,导致线程运行阻塞 首先用jsp命令查看当前进程pid是否发生死锁,然后利用 ...

最新文章

  1. 洛谷 [P1198] 最大数
  2. Let Me Count The Ways(Kickstart Round H 2018)
  3. cdn收费方式有几种
  4. GitBook关联GitHub
  5. HttpHandler应用之 防止图片盗链
  6. html写个用户协议,五分钟学会HTML5的WebSocket协议
  7. 【ArcGIS微课1000例】0009:ArcGIS影像拼接(镶嵌、镶嵌至新栅格)
  8. 使用carbon_东华大学《Carbon》多孔碳纳米纤维复合膜,优异电磁波吸收性能!
  9. JAVASE8.0的安装和配置
  10. 杰理之ANC降噪的硬件要求和物料选型【篇】
  11. spring基础内容
  12. 风控中消费信贷板块的英文词汇
  13. 永远不要和沙雕一样的人去争论,争论最后你会发现你也是一个沙雕
  14. 一个简单的BitTorrent客户端实现(六):peer manager和peer实现
  15. 图文并茂的Python散点图教程
  16. 并行insert出现library cache lock与cursor: pin S wait on X等待问题记录
  17. 纯js实现省市区三级联动
  18. Spring+quartz 动态任务调度
  19. 采用SVM实现实现MNIST手写体分类,数据下载链接在http://yann.lecun.com/exdb/mnist/上。上传源码和实现结果,语言不限。
  20. 贝索斯宣布“退位”,去追寻“诗和远方”

热门文章

  1. SQLOS 简单任务调度
  2. UVA-10714 Ants---蚂蚁模拟
  3. linux中配置DHCP基本操作
  4. redhat6.4中手动创建oracle11g数据库
  5. 了解mysql的三种不同安装方式的区别
  6. php操作session
  7. jQuery插件开发全解析
  8. 嘲笑一下SUN科技日开发者大会 O(∩_∩)O~
  9. 网络专业人士笔记(1~4章)
  10. python 字符串的魔法 day11(2)