分析死锁并处理_整理贴
--死鎖 /****************************************************************************************************************************************************** 死鎖指兩個以上事務相互阻塞相互等待對方釋放它們的鎖,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
分析死锁并处理_整理贴相关推荐
- 在线分析mysql死锁详解_记一次线上mysql死锁分析(一)
记录一次比较诡异的mysql死锁日志.系统运行几个月来,就在前几天发生了一次死锁,而且就只发生了一次死锁,整个排查过程耗时将近一天,最后感谢我们的DBA大神和老大一起分析找到原因. 诊断死锁 借助于我 ...
- 详解SQL Server Profiler分析死锁几大步骤
在两个或多个SQL Server进程中,每一个进程锁定了其他进程试图锁定的资源,就会出现死锁,例如, 进程process1对table1持有1个排它锁(X),同时process1对table2请求1个 ...
- 一个 Linux 上分析死锁的简单方法
2019独角兽企业重金招聘Python工程师标准>>> 简介 死锁 (deallocks): 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无 ...
- java 分析java死锁_Java死锁示例–如何分析死锁情况
java 分析java死锁 死锁是两个线程或多个线程永远被阻塞的编程情况,这种情况发生在至少两个线程和两个或更多资源的情况下. 在这里,我编写了一个简单的程序,它将导致死锁情况,然后我们将看到如何对其 ...
- Java死锁示例–如何分析死锁情况
死锁是两个或多个线程永远被阻塞的编程情况,这种情况发生在至少两个线程和两个或更多资源的情况下. 在这里,我编写了一个简单的程序,该程序将导致死锁情况,然后我们将看到如何对其进行分析. Java死锁示例 ...
- 数据可视化分析票房数据报告_票房收入分析和可视化
数据可视化分析票房数据报告 Welcome back to my 100 Days of Data Science Challenge Journey. On day 4 and 5, I work ...
- sqlserver 抓取所有执行语句 SQL语句分析 死锁 抓取
sqlserver 抓取所有执行语句 SQL语句分析 死锁 抓取 原文:sqlserver 抓取所有执行语句 SQL语句分析 死锁 抓取 在多人开发中最头疼的是人少事多没有时间进行codereview ...
- 几种常见的网络摄像头_DVR方案_整理
几种常见的网络摄像头_DVR方案_整理 http://blog.csdn.net/ex_net/article/details/7833334 作者:张建波 邮箱: 281451020@qq.com ...
- 死锁概念?如何分析死锁和避免死锁?
什么是死锁?如何分析死锁和避免死锁? 死锁就是在多线程运行时,线程对象在获取操作资源时,操作资源被其他线程对象占用而获取不到,导致线程运行阻塞 首先用jsp命令查看当前进程pid是否发生死锁,然后利用 ...
最新文章
- 洛谷 [P1198] 最大数
- Let Me Count The Ways(Kickstart Round H 2018)
- cdn收费方式有几种
- GitBook关联GitHub
- HttpHandler应用之 防止图片盗链
- html写个用户协议,五分钟学会HTML5的WebSocket协议
- 【ArcGIS微课1000例】0009:ArcGIS影像拼接(镶嵌、镶嵌至新栅格)
- 使用carbon_东华大学《Carbon》多孔碳纳米纤维复合膜,优异电磁波吸收性能!
- JAVASE8.0的安装和配置
- 杰理之ANC降噪的硬件要求和物料选型【篇】
- spring基础内容
- 风控中消费信贷板块的英文词汇
- 永远不要和沙雕一样的人去争论,争论最后你会发现你也是一个沙雕
- 一个简单的BitTorrent客户端实现(六):peer manager和peer实现
- 图文并茂的Python散点图教程
- 并行insert出现library cache lock与cursor: pin S wait on X等待问题记录
- 纯js实现省市区三级联动
- Spring+quartz 动态任务调度
- 采用SVM实现实现MNIST手写体分类,数据下载链接在http://yann.lecun.com/exdb/mnist/上。上传源码和实现结果,语言不限。
- 贝索斯宣布“退位”,去追寻“诗和远方”