1. 程式人生 > >MySQL視訊筆記—事務的隔離級與鎖

MySQL視訊筆記—事務的隔離級與鎖

極客學院

1.事務隔離級別

事務隔離級別:

  • SERIALIZABLE(序列化)
  • REPEATABLE READ(可重複讀)
  • READ COMMIT(提交讀)
  • READ UNCOMMIT(未提交讀)

要了解MySQL的隔離級別,首先要了解MySQL事務的併發問題:

  • 1.髒讀:事務A讀取了事務B更新的資料,然後B回滾操作,那麼A讀取到的資料是髒資料。
  • 2.不可重複讀:事務A多次讀取同一資料,事務B在事務A多次讀取的過程中,對資料做了更新並提交,導致事務A多次讀取同一資料時,結果不一致。
  • 3.幻讀:系統管理員A將資料庫中所有學生的成績從具體分數改為ABCDE等級後,但是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。

總結:不可重複讀的和幻讀很任意混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表。

MySQL事務隔離級別:

這裡寫圖片描述

鎖、時間戳、樂觀併發控制(樂觀鎖)和悲觀併發控制(悲觀鎖)是併發控制主要取樣的技術手段。

# 1.檢視當前會話隔離級別
select @@tx_isolation;

# 2.檢視系統當前隔離級別
select @@global.tx_isolation;

# 3.設定當前會話隔離級別
set session transaction isolation level repeatable read;

4.設定系統當前隔離級別
set
global transaction isolation level repeatable read;

2.MySQL效能與非事務表的表鎖定

讀鎖(共享鎖):是讀取操作建立的鎖。其他使用者可以併發讀取資料,但任何事務都不能對資料進行修改(獲取資料上的排他鎖),直到已釋放所有共享鎖。

如果事務T對資料A加上共享鎖,則其他事務只能對A再加共享鎖,不能加排他鎖。獲取共享鎖的事務只能讀資料,不能修改資料。

寫鎖(排他鎖):如果事務T對資料A加上排他鎖後,則其他事務不能對A加任何型別的封鎖。獲取排他鎖的事務既能讀資料,又能修改資料。

事務可以通過以下語句給sql加共享鎖和排他鎖:

共享鎖:select
...... lock in share mode;
排他鎖:select ...... for update;

支援事務的資料庫在保持不同使用者彼此隔離方面要比非事務資料庫複雜,因此自然反映在系統的效能上面。

在使用事務表時,提高效能的一些方法:

  • 使用小事務
  • 選擇合適的隔離級別
  • 保證開始事務前一切都是可行的
  • 避免死鎖

MySQL鎖詳解:

資料庫鎖機制簡單來說,就是資料庫為了保證資料的一致性,而使各種共享資源在被併發訪問變得有序所設計的一種規則。

MySQL各儲存引擎使用了三種類型(級別)的鎖定機制:表級鎖定,行級鎖定和頁級鎖定。

表級鎖定:

表級別的鎖定時MySQL各儲存引擎中最大顆粒度的鎖定機制。該鎖定機制最大的特點時實現邏輯非常簡單,帶來的系統負面影響最小。所以獲取鎖和釋放鎖的速度很快。由於表級鎖一次會將整個表鎖定,所以可以很好的避免困擾我們的死鎖問題。

當然,鎖定顆粒度大所帶來的負面影響就是出現鎖定資源爭用的概率也會最高,致使並大度大打折扣。使用表級鎖定的主要時MyISAM,MEMORY,CSV等一些非事務性儲存引擎。

行級鎖定:

行級索定最大的特點就是鎖定物件的顆粒度很小,也是目前各大資料庫管理軟體所實現的鎖定顆粒度最小的。由於鎖定顆粒度很小,所以發生鎖定資源爭用的概率也最小,能夠給予應用程式儘可能大的併發處理能力而提高一些需要高併發應用程式的整體效能。

雖然能夠在併發處理能力上面有較大的優勢,但是行級鎖定也因此帶來了不少弊端。由於鎖定資源的顆粒度很小,所以每次獲取鎖和釋放鎖需要做的事情也更多,帶來的消耗也就更大了。此外,行級鎖定也最容易發生死鎖。使用行級鎖定的主要是InnoDB儲存引擎。

頁級鎖定:

行級鎖定是MySQL中比較獨特的一種鎖定級別,在其他資料庫管理軟體中也並不是太常見。
頁級鎖定的特點是鎖定顆粒度介於行級鎖定與表級鎖之間,所以獲取鎖定所需要的資源開銷,以及所能提供併發處理能力也同樣介於上面二者之間。另外,頁級鎖定和行級鎖定一樣,會發生死鎖。

在資料庫實現資源鎖定的過程中,隨著鎖定資源顆粒度的減少,鎖定相同資料量的資料所需要消耗的記憶體數量是越來越多的,實現演算法也會越來越複雜。不過,隨著鎖定資源顆粒度的減小,應用程式的訪問請求遇見鎖等待的可能性也會隨之降低,系統整體併發度也隨之提升。

使用頁級鎖定的主要是BerkeleyDB儲存索引。

總的來說,MySQL這3種鎖的特性可大致歸納如下:
表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的概率最高,併發度最低;
行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高;
頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度一般。
適用:從鎖的角度來說,表級鎖更適合於以查詢為主,只有少量按索引條件更新資料的應用,如Web應用;而行級鎖則更適合於有大量按索引條件併發更新少量不同資料,同時又有併發查詢的應用,如一些線上事務處理(OLTP)系統。