當前位置:
首頁 > 知識 > MySQL-事務的啟動/設置/鎖/解鎖——入門

MySQL-事務的啟動/設置/鎖/解鎖——入門


實踐 - 基礎

首先,在你的空資料庫上(譬如Test預留資料庫),創建一個test表,有idtext(varchar 50)兩個欄位。

請開啟兩個MySQL操作端,分別依次鍵入:


A端 B端
SET AUTOCOMMIT=0 SET AUTOCOMMIT=0
SELECT text FROM test WHERE id = 1 不輸入
UPDATE test SET text="UioSun" WHERE id = 1; UPDATE test SET text="UioYang" WHERE id = 1;

注意你的查詢提示欄,你能發現:在A端未提交之前,默認狀態下,B端的UPDATE是沒有反饋的——被掛起。等待一段時間後,你能收到關於Transaction失敗的消息。

這種錯誤狀態被稱為死鎖,你可以通過解鎖相關的內容,來Kill it。

上述是很極端的情況,正常來說,事務是通過自動插入來完成,基本上可以避免死鎖情況。

這就是事務的基礎演示,最後,通過ROLLBACKCOMMIT,你可以完成事務的結束。


實踐 - 鎖

在上一部分,你完成了一個事務的基礎流程,啟動、進行、並最終得到結果(或許是意外結果)。至少我在上一部分結尾處,腦海中有兩個問題:

  1. 我聽過事務的鎖,它通過鎖完成獨享目標,並在完成修改後釋放它的獨享權,但我該如何設置它的級別?

  2. 鎖的阻塞時間為多久?我如何檢測它?

當然,為了另一種思路的編程玩家,我也將在本節末尾放上當前支持鎖的優缺比較。



行級鎖,頁級鎖,表級鎖。聞其名知其意,比較少見的是:頁級鎖,它鎖定的是一組相鄰數據。

而MySQL的不同引擎,對鎖級別支持是不一樣的,以最常用的InnoDB為代表,默認採用行級鎖,也支持表級鎖,但這是有條件的,只有在針對索引SQL操作時,才會使用行級鎖,否則這個操作將採取表級鎖。

表級鎖鎖定的數量最多,佔據內存最多,但有在做內部處理時中,它的操作速度是相當快的,而且幾乎不存在死鎖問題,所以在中大型內部處理機制中,表級鎖的應用場景大於行級鎖。

行級鎖又分為共享鎖和獨佔鎖(排它鎖,翻譯差異),允許讀取的共享鎖是默認鎖,而獨佔鎖是不允許讀寫的完全佔有——廢話。

共享鎖(S):允許一個事務去讀一行,阻止其他事務獲得相同數據集的排他鎖。

排他鎖(X):允許獲得排他鎖的事務更新數據,阻止其他事務取得相同數據集的讀寫。

另外,為了允許行鎖和表鎖共存,實現多粒度鎖機制,InnoDB還有兩種內部使用的意向鎖(Intention Locks),這兩種意向鎖都是表鎖

意向共享鎖(IS):事務打算給數據行加行共享鎖,事務在給一個數據行加共享鎖前必須先取得該表的IS鎖。

意向排他鎖(IX):事務打算給數據行加行排他鎖,事務在給一個數據行加排他鎖前必須先取得該表的IX鎖。

額外的鎖

除了DB本身分類外,在框架層面,還有樂觀鎖與悲觀鎖之分。注意層面,這種鎖屬於應用程序設計的鎖,而非資料庫設計的鎖。

以我最熟悉的Yii 2框架為例。簡述:

  1. 樂觀鎖就是一個可對比序列號,但存在高頻並發時的對比錯位 BUG;

  2. 悲觀鎖就是一個嚴謹可對比序列號,並提供解鎖功能。事實上,由於悲觀鎖的使用複雜度(我沒看出來),Yii 2並沒有提供悲觀鎖功能。

解鎖

說完鎖,我們肯定需要一個解鎖機制,腦海里忽然蹦出冷段子:一人去買門鎖,安好了才發現,這門只能從外面開,進去鎖門就出不來了。

很冷吧。沒有解鎖機制的事務處理系統,是一個只能進,不能出的事務處理系統——死鎖儘管會自動解鎖,但反饋時間是一個很剛性的設置。

先說這個很剛的設置,如果你想修改它,可以去 my.ini 文件的innodb_lock_wait_timeout這一行,默認為50

s的等待時間。

應用層面的鎖可以通過校對序列號來自行解鎖,而MySQL層面的鎖,可以通過information_schemePROCESSLIST表,來完成解鎖——確認無法完成事務。

這裡說一下PROCESSLIST表,當一個關閉自動提交的事務已經啟動,另一個同類事務也啟動,雙方衝突後,在這個表內是存在衝突SQL Status,你可以自己去觀察。

最後:無論解鎖機制多麼健全,死鎖本身是代碼邏輯引起的,不修正/優化代碼邏輯,單純的解鎖機制不過是對系統的額外負擔。

解決方案很簡單:自己寫一個簡單的Log功能,將所有觸發解鎖機制的情況,記錄在Log里,自行優化。


隔離

配合鎖機制的就是隔離機制,它可以儘可能有效的設置:事務間的可見度。

  1. 讀取未提交(RU,Read Uncommitted):最低隔離,問題是臟讀(未被提交的UPDATE,仍然可被讀取)。

  2. 讀取提交(RC,Read Committed):語句提交以後即執行了COMMIT以後別的事務就能讀到這個改變. 問題:不可重複讀(同事務時,前後讀取到不一致數據)。

  3. 可重複讀(RR,Repeatable Read):在同一個事務裡面先後執行同一個查詢語句的時候,得到的結果是一樣的,問題:幻讀(並發事務同時處理同內容,並導致一方內容覆蓋了另一方,令對方感覺出現了幻覺)。

  4. 序列化(S,Serializable):在這個級別下,所有的事務的完整性都被保留,意味著所有的事務都可以被序列化的執行,只有當兩個事務之間沒有任務衝突時,才能並發的執行。

四個級別中,高級隔離不會遇到比自己低級隔離的問題,但隔離級別越高,對並發的損失性越高。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 青峰科技 的精彩文章:

JDBC與JAVA資料庫編程
網路TCP連接三次握手與四次揮手
35年编程史沉淀下来的8条宝贵经验
javaWeb框架Spring Boot API 版本許可權控制

TAG:青峰科技 |

您可能感興趣

Cloudflare推出.1公共DNS服務,老張教你如何設置DNS
Nginx 教程(3):SSL 設置
Wi-Fi/無線區域網-iPhone設置篇
Centos7/RHEL7-firewalld設置訪問規則
Windows10的幾項優化設置(SSD的用戶也看過來)
iOS 12.2設置界面曝光:包含傳聞AirPods 2的「嘿 Siri」設置
Oculus Quest、Rift S入門設置官方視頻教程
聯想InsydeH20類型BIOS設置U盤啟動教程
三星Galaxy S9將引入Bixby助理作為新機設置嚮導
蘋果推送iOS 11.3 便於用戶控制iPhone電池設置
小教程|Cloudflare推出1.1.1.1公共DNS服務,老張教你如何設置DNS
MacOS 系統中如何設置 Python 虛擬環境
AWS Control Tower助用戶快速設置多賬戶環境
iOS 13更新了HomePod音箱設置,需要掃描LED模式
升級 iOS 13 Beta 6 後,iPhone XR 如何設置鎖屏動態壁紙?
spring-cloud 服務網關中的 Timeout 設置
安全的 SSH 設置
教你windows10系統BIOS設置U盤啟動的方法
Linux上合理設置網卡的MTU值
Win10重裝為Win7的BIOS設置和硬碟分區方法