mysql鎖及四種事務隔離級別筆記


前言
  • 數據庫是一個共享資源,為了充分利用數據庫資源,發揮數據
    庫共享資源的特點,應該允許多個用戶並行地存取數據庫。但這樣就會產生多個用戶程序並
    發存取同一數據的情況,為了避免破壞一致性,所以必須提供並發控制機制。

  • 並發控制是以事務(transaction)為單位進行的。

什么時候表鎖什么時候行鎖?
  • 行鎖是指的innodb引擎,只有通過索引條件檢索數據,InnoDB才會使用行級鎖,否則,InnoDB將使用表鎖。
查看表鎖
#查看是否有鎖表的情況
show OPEN TABLES where In_use > 0;

#拼接hyq用戶的kill語句,謹慎執行。
select  concat('KILL ',id,';') from
information_schema.processlist where user='hyq';

#查看當前的事務
SELECT * FROM information_schema.innodb_trx;
#查看當前鎖定的事務
SELECT * FROM information_schema.innodb_locks;
#查看當前等鎖的事務
SELECT * FROM information_schema.innodb_lock_waits;
查看行鎖
SHOW STATUS LIKE 'innodb_row_lock%';
四種事務隔離級別
  • 一個事務對某個數據對象加鎖后究競擁有什么樣控制是由封鎖類型決定的,基本的鎖有兩種,排它鎖(寫鎖、X鎖),共享鎖(讀鎖、S鎖)。兩者的相容關系如下:

file

例子:

file

未提交讀(Read uncommitted)
  • 未提交讀是數據庫事務隔離級別中最低的一種,在這種級別下,一個事務會讀到另一個事務更新后但未提交的數據,如果事務1 rollback后,那么事務2讀取的數據就是臟數據,簡稱臟讀。
    file
已提交讀(Read Committed)
  • 只能讀取到已經提交的數據。在事務1內,多次讀同一數據,在這個事務還沒有結束時,如果事務2恰好修改了這個數據,那么,在事務1中,兩次讀取的數據就可能不一致。也就是說的不可重復讀的問題。如下:

file

可重復讀(Repeated Read)
  • 可重復讀就是多次讀取的結果都一直,而不可重復讀是指,在一個事務內,多次讀同一數據,在這個事務還沒有結束時,如果另一個事務恰好修改了這個數據,那么,在第一個事務中,兩次讀取的數據就可能不一致。在這種情況下可能會遇到幻讀的問題如下:

file

可串行化(Serializable )
  • 可串行性是並行調度正確性的唯一准則,所有事務按照次序依次執行,因此,臟讀、不可重復讀、幻讀都不會出現。
    為保證並行調度可串行性而提供的封鎖協議。因此我們可以得出如下結論:這個事務級別的,其並行執行的結果一定是正確的,但是呢,由於串行執行,大大降低了並行度,所以一般不使用它。
    file

歡迎來公眾號【俠夢的開發筆記】 一起交流進步


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM