前言
- 數據庫是一個共享資源,爲了充分利用數據庫資源,發揮數據
庫共享資源的特色,應該容許多個用戶並行地存取數據庫。但這樣就會產生多個用戶程序並
發存取同一數據的狀況,爲了不破壞一致性,因此必須提供併發控制機制。數據庫
- 併發控制是以事務(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鎖)。二者的相容關係以下:
例子:segmentfault
未提交讀(Read uncommitted)
- 未提交讀是數據庫事務隔離級別中最低的一種,在這種級別下,一個事務會讀到另外一個事務更新後但未提交的數據,若是事務1 rollback後,那麼事務2讀取的數據就是髒數據,簡稱髒讀。
已提交讀(Read Committed)
- 只能讀取到已經提交的數據。在事務1內,屢次讀同一數據,在這個事務尚未結束時,若是事務2剛好修改了這個數據,那麼,在事務1中,兩次讀取的數據就可能不一致。也就是說的不可重複讀的問題。以下:
可重複讀(Repeated Read)
- 可重複讀就是屢次讀取的結果都一直,而不可重複讀是指,在一個事務內,屢次讀同一數據,在這個事務尚未結束時,若是另外一個事務剛好修改了這個數據,那麼,在第一個事務中,兩次讀取的數據就可能不一致。在這種狀況下可能會遇到幻讀的問題以下:
可串行化(Serializable )
- 可串行性是並行調度正確性的惟一準則,全部事務按照次序依次執行,所以,髒讀、不可重複讀、幻讀都不會出現。
爲保證並行調度可串行性而提供的封鎖協議。所以咱們能夠得出以下結論:這個事務級別的,其並行執行的結果必定是正確的,可是呢,因爲串行執行,大大下降了並行度,因此通常不使用它。
併發
歡迎來公衆號【俠夢的開發筆記】 一塊兒交流進步