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
  • 移動開發(一):使用.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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...