mysql 開發進階篇系列 14 鎖問題(避免死鎖,死鎖查看分析)

来源:https://www.cnblogs.com/MrHSR/archive/2018/08/04/9419178.html
-Advertisement-
Play Games

一. 概述 通常來說,死鎖都是應用設計問題,通過調整業務流程,資料庫對象設計,事務大小,以及訪問資料庫的sql語句,絕大部分死鎖都可以避免,下麵介紹幾種避免死鎖的常用 方法. 1. 在應用中,如果不同的程式併發操作多個表,應儘量約定以相同的順序來訪問表,這樣可以大大降低產生死鎖的機會。按順序對錶進行 ...


一. 概述

  通常來說,死鎖都是應用設計問題,通過調整業務流程,資料庫對象設計,事務大小,以及訪問資料庫的sql語句,絕大部分死鎖都可以避免,下麵介紹幾種避免死鎖的常用 方法.
  1. 在應用中,如果不同的程式併發操作多個表,應儘量約定以相同的順序來訪問表,這樣可以大大降低產生死鎖的機會。按順序對錶進行操作,是很常用的一種避免死鎖的操作。 比如:有二個不一樣的存儲過程,同時在對一個表進行複雜的刪改操作。這種情況可以考慮先讓一個執行完成,再讓另一個在執行。
  2. 在程式中以批量方式處理數據的時候,如果事先對數據排序,保證每個線程按固定的順序來處理記錄,也可以大大降低出現死鎖的可能。比如常見的就是多線程下在程式中lock鎖住,在進程下保持串列處理。
  3. 在事務中,如果要更新記錄,應該直接申請足夠級別的鎖,即排它鎖,而不是先申請共用鎖,更新時再申請排他鎖,因為當用戶申請排他鎖時,其它事務可能又已經獲得了相同記錄的共用鎖,從而造成鎖衝突。 我理解是在事務中首先將要更新的記錄,以select .. for update方式獲得排它鎖, 在事務里處理完邏輯後就可以直接更新而不用考慮鎖衝突。 代碼如下:

SET autocommit=0
-- 將要更新的數據先獲得排它鎖
SELECT * FROM city WHERE city_id=103 FOR UPDATE;
-- 邏輯處理  ....
-- 最後更新可以避免鎖衝突
UPDATE city SET cityname='杭州' WHERE city_id=103;
COMMIT;

  4. 在預設級別Repeatable read下, 如果兩個線程同時對相同條件記錄用 select .. for update 加排它鎖,在沒有符合該條件記錄情況下兩個線程都會加鎖成功。當一個程式發現記錄不存在,就試圖插入一條新數據,如果兩個線程都這麼做,就會出現死鎖。這是因為在Repeatable read下產生了間隙鎖。這種情況下,將隔離級別改成Read commited,就可避免問題 如下圖表格 貼出了二個隔離級別下產生鎖的差異。

  5. 當在Repeatable read下,如果兩個線程都先執行select .. for update。 在判斷是否存在符合條件的記錄,如果沒有,就插入記錄,此時,只有一個線程能插入成功,另一個線程會出現鎖等待, 當第1個線程提交後,第2個線程如因為主鍵值重覆,會出現異常。但卻獲得了一個排它鎖, 需要執行rollback釋放排它鎖。避免影響其它事務。
  總結:儘管通過上面介紹和sql 優化等措施,可以大大減少死鎖,但死鎖很難完全避免。因此。 在程式設計中總是捕獲並處理死鎖異常是一個很好的編程習慣。在程式異常里或commit或rollback。

二. 檢查死鎖產生的原因

  如果出現死鎖,可以用SHOW ENGINE INNODB STATUS 命令來確定最後一個死鎖產生的原因。返回結果中包括死鎖相關事務的詳細信息,如引發死鎖的sql語句,事務已經獲得的鎖,正在等待什麼鎖,以及被回滾的事務等,以此分析死鎖產生的原因和改進措施。

-- 查看最後一個死鎖
SHOW ENGINE  INNODB STATUS;
LATEST DETECTED DEADLOCK
------------------------
2018-08-02 18:07:45 0x7f3a12209700
*** (1) TRANSACTION:
TRANSACTION 35489574, ACTIVE 114 sec STARTING INDEX READ
mysql TABLES IN USE 1, locked 1
LOCK WAIT 4 LOCK struct(s), HEAP size 1136, 2 ROW LOCK(s)
MySQL thread id 2634494, OS thread handle 139887387092736, QUERY id 109768880 172.168.18.202 root Sending DATA
-- 因為會話2 已獲得排他鎖, 些語句 等待
 SELECT * FROM cityNew  WHERE city_id=103 FOR UPDATE
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS SPACE id 479 page NO 3 n bits 72 INDEX GEN_CLUST_INDEX of TABLE `test`.`cityNew` trx id 35489574 lock_mode X waiting
*** (2) TRANSACTION:
TRANSACTION 35489577, ACTIVE 8 sec STARTING INDEX READ, thread declared inside INNODB 5000
mysql TABLES IN USE 1, locked 1
4 LOCK struct(s), HEAP size 1136, 3 ROW LOCK(s)
MySQL thread id 2634624, OS thread handle 139887388956416, QUERY id 109768953 172.168.18.202 root statistics
-- 死鎖
 SELECT * FROM city  WHERE city_id=103 FOR UPDATE
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS SPACE id 479 page NO 3 n bits 72 INDEX GEN_CLUST_INDEX of TABLE `test`.`cityNew` trx id 35489577 lock_mode X
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS SPACE id 477 page NO 3 n bits 80 INDEX PRIMARY of TABLE `test`.`city` trx id 35489577 lock_mode X LOCKS rec but NOT gap waiting
*** WE ROLL BACK TRANSACTION (2)
------------

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

-Advertisement-
Play Games
更多相關文章
  • 首先安裝一個box,安裝一個centos7,然後就是xshell,接下來就是 查看ip 1. ifconfig 2. ip addr 3. vi /etc/sysconfig/network scripts/ifcfg xx 4. yum install net tools 打開box,啟動安裝好的 ...
  • 1. HTTP的請求方法以及響應狀態碼 1.1. 請求方法 http請求方法有GET、POST、PUT、HEAD、DELETE、OPTIONS、TRACE、CONNECT。當然上述方法是基於HTTP/1.1的,HTTP/1.0中獨有的方法就不說了。 GET 獲取資源 GET方法一般用來從伺服器上獲取 ...
  • 1.簡介 電腦組成 CPU 硬體RAM 硬體Disk 操作系統(OS) 管理和控制電腦硬體與軟體資源的電腦程式,是直接運行在“裸機”上的最基本的系統軟體 任何其他軟體都必須在操作系統的支持下才能運行 組成: linux優勢: 開源,免費,安全 各大互聯網公司都在用 代碼都運行在linux上 l ...
  • 在win10中,註冊表的信息是我們在修改設置的時候經常都是需要用到的一個功能,註冊表對我們的操作來說是很重要的,今天看到有小伙伴在Win10系統註冊表被鎖定了,我們在註冊表中就不可以正常的修改和操作了,今天小編就來跟大家分享一下Win10系統註冊表被鎖定後快速解除鎖定的方法分享。 具體的方法和詳細的 ...
  • 占座 ...
  • 轉自:http://www.maomao365.com/?p=6973 摘要: 在sql腳本編寫中,如果需要在update delete 中使用表別名的方法,必須按照一定的規則編寫,否則將會出現相應的異常信息,如下所示: 實驗環境:sqlserver 2008 R2 ...
  • 1.顯示分區 show partitions tables; 2.SHELL里導出文件顯示欄位 set hive.cli.print.header ...
  • 最近我問了很多Java開發人員關於最近12個月內他們使用的是什麼大數據工具。 這是一個系列,主題為: 語言 web框架 應用伺服器 SQL數據訪問工具 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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...