分析死鎖並處理_整理貼5 《轉帖》

来源:http://www.cnblogs.com/linaGh/archive/2017/10/26/7735297.html
-Advertisement-
Play Games

--死鎖/************************************************************************************************************************************************* ...



--死鎖
/******************************************************************************************************************************************************
死鎖指兩個以上事務相互阻塞相互等待對方釋放它們的鎖,SQL Server會通過回滾其中一個事務並返回一個錯誤來自已解決阻塞問題,讓其他事務完成它們的工作。

整理人:中國風(Roy)

日期:2008.07.20
******************************************************************************************************************************************************/

set nocount on ;
if object_id('T1') is not null
drop 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'
go

if object_id('T2') is not null
drop 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 C

T2:
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 tran
update t1 set col2=col2+'A' where col1=101

--3步:
select * from t2 where col1=201
commit tran


--連接視窗2

--2步:
begin tran
update 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 tran
update 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 tran
update 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 tran
update t1 set col1=col1+1 where ID=1

--3步:
select col1 from t2 where ID=1
commit tran

 

--連接視窗2:
--2步:
begin tran
update 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 tran
update t1 set col1=col1+1 where ID=1

--3步:
select col1 from t2 where ID=1
commit tran

--連接視窗2:
--2步:
begin tran
select col1 from t1 where ID=1--會等待連接視窗1提交
--4步
update t2 set col1=col1+1 where ID=1
commit tran

死鎖3(單表):

--連接視窗1:

while 1=1
update T1 set col1=203-col1 where ID=2

--連接視窗2:
declare @i nvarchar(20)
while 1=1
set @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 t1
B、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 該事件發生了死鎖

原文地址:http://bbs.csdn.net/topics/250022124

附:阻塞分析:http://blog.csdn.net/roy_88/archive/2008/07/21/2682044.aspx


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 每次切換線程的操作 變換封裝操作 使用的時候 水一波 ...
  • App啟動卡慢會影響一個App的卸載率和使用率。啟動速度快會給人一種輕快的感覺,減少用戶等待時間。如果一個App從點擊桌面圖標到看到主界面花了10秒,請問你能接受麽?忍耐不好的估計直接就卸載了,或者沒等打開就直接Home鍵按出去,然後殺進程了。這樣一來App卸載率提升了,使用率下降了。所以對於有大量... ...
  • 1.KVO簡介 KVO是Objective-C對觀察者設計模式的一種實現,它提供一種機制,指定一個被觀察對象(如A類),當對象中的某個屬性發生變化的時候,對象就會接收到通知,並作出相應的處理。在MVC設計架構下的項目,KVO機制很適合實現mode模型和view視圖之間的通訊。例如:代碼中,在模型類A ...
  • 1.什麼是自動引用計數? 顧明思義,自動引用計數(ARC,Automatic Reference Counting)是指記憶體管理中對引用採取自動計數的技術。 在OC中採用ARC機制,讓編譯器來進行記憶體管理。在新一代apple LLVM編譯器中設置ARC為有效狀態,就無需再次鍵入retain或者rel ...
  • 一、HTML是什麼? HTML(hypertext mark-uplanguage)是 超文本標記語言, 主要的用處是做網頁, 可以在網頁上顯示 文字、圖像、視頻、聲音… HTML只能做靜態網頁 二、HTML發展歷史 html之父-Tim Berners-Lee蒂姆·伯納斯-李(Tim Berner ...
  • 電話撥號示例 代碼 //創建對象 //指定操作 //指定Uri //啟動 備註 需要許可權android.permission.CALL_PHONE 添加方式AndroidManifest.xml內manifest之後application之前 ...
  • 最近用ionic3+angular4做項目。我遇到了個問題,我返回原來頁面時一般都會調用this.navCtrl.pop()方法,但這個方法不能攜帶參數。怎麼辦? 可以寫個回調方法。 我在a頁面定義個回調方法。 在跳轉到的頁面,接受這個回調方法。 這樣,你就可以返回頁面時也把參數傳回去。 ...
  • ViewPager是v4支持庫中的一個控制項,相信幾乎所有接觸Android開發的人都對它不陌生。之所以還要在這裡翻舊賬,是因為我在最近的項目中有多個需求用到了它,覺得自己對它的認識不夠深刻。我計劃從最簡單的使用場景出發,記錄我到目前為止所對ViewPager的使用情況以及有關它的一些知識點。 這個系 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...