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

前言
  • 數據庫是一個共享資源,為了充分利用數據庫資源,發揮數據

    庫共享資源的特點,應該允許多個用戶並行地存取數據庫。但這樣就會產生多個用戶程序並
    發存取同一數據的情況,為了避免破壞一致性,所以必須提供併發控制機制。
  • 併發控制是以事務(transaction)為單位進行的。
什麼時候表鎖什麼時候行鎖?
  • 行鎖是指的innodb引擎,只有通過索引條件檢索數據,InnoDB才會使用行級鎖,否則,InnoDB將使用表鎖。
查看錶鎖
<code>#查看是否有鎖表的情況
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;/<code>
查看行鎖
<code>SHOW STATUS LIKE 'innodb_row_lock%';/<code> 
四種事務隔離級別
  • 一個事務對某個數據對象加鎖後究競擁有什麼樣控制是由封鎖類型決定的,基本的鎖有兩種,排它鎖(寫鎖、X鎖),共享鎖(讀鎖、S鎖)。兩者的相容關係如下:
mysql鎖及四種事務隔離級別筆記

例子:

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

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

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

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

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


分享到:


相關文章: