SQLServer中的死鎖的介紹

来源:http://www.cnblogs.com/wenBlog/archive/2016/02/25/5217103.html
-Advertisement-
Play Games

簡介 什麼是死鎖? 我認為,死鎖是由於兩個對象在擁有一份資源的情況下申請另一份資源,而另一份資源恰好又是這兩對象正持有的,導致兩對象無法完成操作,且所持資源無法釋放。 什麼又是阻塞? 阻塞是由於資源不足引起的排隊等待現象。比如同時兩個進程去更新一個表。 這裡我們可以把阻塞作為死鎖的必要條件。下麵我們


簡介

     什麼是死鎖?

     我認為,死鎖是由於兩個對象在擁有一份資源的情況下申請另一份資源,而另一份資源恰好又是這兩對象正持有的,導致兩對象無法完成操作,且所持資源無法釋放。

      什麼又是阻塞?

     阻塞是由於資源不足引起的排隊等待現象。比如同時兩個進程去更新一個表。

     這裡我們可以把阻塞作為死鎖的必要條件。下麵我們先理解一下死鎖和阻塞再來看一下我最近遇到一個問題以及解決思路。

SQLServer中的死鎖

     對應到SQL Server中,當在兩個或多個任務中,如果每個任務鎖定了其他任務試圖鎖定的資源,此時會造成這些任務永久阻塞,從而出現死鎖;

   這些資源可能是:單行(RID,堆中的單行)、索引中的鍵(KEY,行鎖)、頁(PAG8KB)、區結構(EXT,連續的8)、堆或B(HOBT) 、表(TAB,包括數據和索引)、文件(File,資料庫文件)、應用程式專用資源(APP)、元數據(METADATA)、分配單元(Allocation_Unit)、整個資料庫(DB)

    下麵我簡單舉一個例子來說明一下死鎖的原理:

    

 

 如圖,按步驟執行:

1. begin tran
update test1 set aaa=1

2.

begin tran

update test2 set aaa=1

update test1 set bbb=2

3.再次執行圖1中的Update test2 set bbb=2

執行完成後發現數據並未插入,且一直處於running狀態

 

這個時候我們通過語句查詢死鎖的進程和語句。得到如下結果:

 

很容易發現發生死鎖的語句,也可以使用 SQL Server Profiler 分析死鎖: Deadlock graph 事件類添加到跟蹤。此事件類使用死鎖涉及到的進程和對象的 XML 數據填充跟蹤中的 TextData 數據列。SQL Server 事件探查器 可以將 XML 文檔提取到死鎖 XML  文件中,以後可在 SQL Server Management Studio 中查看該文件。如圖:

接下來我們說一下如何處理死鎖

      1.臨時解決方案,先Kill 掉死鎖的進程,只是暫時解決這個問題。

      2.SQL Server自動選擇一條SQL作死鎖犧牲品:當死鎖發生時,鎖監視器線程執行死鎖檢查,資料庫引擎 選擇運行回滾開銷最小的事務的會話作為死鎖犧牲品,返回1205 錯誤,回滾死鎖犧牲品的事務並釋放該事務持有的所有鎖,使其他線程的事務可以請求資源並繼續運行。

伺服器: 消息 1205,級別 13,狀態 50,行 1 事務(進程 ID  xx)與另一個進程已被死鎖在  lock 資源上,且該事務已被選作死鎖犧牲品。請重新運行該事務。

     3.使用SET LOCK_TIMEOUT timeout_period(單位為毫秒)來設定請求超時。 

     4.在SQLServer 和程式兩個方面都可以做代碼上修正,這裡不在詳細描述,主要是通過發現死鎖等待一段時間後再次嘗試的方式來解決。

預防和避免死鎖

     1.儘量減少事務執行的時間。

     2.在合理的範圍內降低隔離級別。

     3.同一個事務內儘量避免出現迴圈對同一個表的處理。

     4.同一個事務內較少用戶交互,即鎖的競爭。

     5.儘量保證邏輯處理的順序比如對錶的處理都按照一個順序進行。

     6.對於需要各種邏輯處理的表,可以通過增加索引的方式來減少鎖的競爭。

     7.儘量減少非聚集索引的include 的列,也能減少外鍵死鎖的發生。

     8.同一個對象儘量採用select 在update 前來使用。

     9.對於實時性要求不高的可以使用with(nolock)來實現對錶的查詢,但是可能會差生臟讀。

 

 總結

      本文簡單的介紹了死鎖的原因,如何解決和預防。當然任何事情都是雙刃劍,還要我們根據實際情況來合理減少死鎖和阻塞的發生;對於不同隔離界別鎖帶來的問題可以看一下我之前的一篇關於鎖的介紹。希望對死鎖發生預防和解決有一定的幫助。


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

-Advertisement-
Play Games
更多相關文章
  • 該文章主要作為Hadoop技巧系列文章的索引,方便大家閱覽。
  • PostgreSQL的AVG函數是用來找出各種記錄中的一個欄位的平均值。 為了理解AVG函數考慮表COMPANY 有如下記錄: testdb# select * from COMPANY; id | name | age | address | salary ----+-------+-----+-
  • Oracle連接odbc數據源 說明 oracle連接ODBC數據源有兩種方式,hsodbc和dg4odbc,簡單說dg4odbc是hsodbc的升級。兩種連接方法大致一樣,現將連接步驟說明如下: 檢查DG4ODBC驅動是否已經安裝 方法如下: 在Oracle伺服器上,cmd視窗中執行命令(dg4o...
  • 原創博客,轉載請聯繫博主! (零)ElasticSearch架構概述 ElasticSearch是現在技術前沿的大數據引擎,常見的組合有ES+Logstash+Kibana作為一套成熟的日誌系統,其中Logstash是ETL工具,Kibana是數據分析展示平臺。ES讓人驚艷的是他強大的搜索相關能力和
  • 一 MySQL概述 MySQL是一個很受歡迎的開源資料庫,當我從Oracle轉來做MySQL的時候,感覺最深刻的一點就是,這家伙居然是Server和Storage分開的!而且更不能忍的是,它竟然是插件式存儲引擎,每一種引擎的特點是很不相同的,當時我感覺這東西也太難學了吧,我要學多少個引擎啊。後來我發
  • 本文由ilanniweb提供友情贊助,首發於爛泥行天下 想要獲得更多的文章,可以關註我的微信ilanniweb 公司目前使用的資料庫是阿裡雲的RDS,目前RDS的版本為mysql5.6。如下: 現在要求把RDS的數據,在公司內部本地進行恢復。 如何把RDS在本地進行恢復呢?這個阿裡雲官網給出了相關的...
  • 本地: 1.進入MySQL目錄下的bin文件夾:e:回車; e:\>cd mysql\bin? 回車 2.導出資料庫:mysqldump -u 用戶名 -p 資料庫名 > 導出的文件名 範例:mysqldump -uroot -p abc > abc.sql(導出資料庫abc到abc.sql文件)提
  • 事主的問題應該是想把最新的數據和次新數據放在一行里顯示。 因為沒有說明重覆的情況如何處理,即有多個最新數據或者有多個次新數據,所以我沒有做過多的處理。 哈哈哈。
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...