鎖是數據庫系統區別於文件系統的一個關鍵特性。mysql
鎖機制用於管理對共享資源的併發訪問,提供數據的完整性和一致性。sql
InnoDB存儲引擎不只會在行級別上對錶數據上鎖,還會在數據庫內部其餘多個地方使用鎖,從而容許對多種不一樣資源提供併發訪問。如:操做緩衝池中LRU列表,刪除、添加、移動LRU列表中的元素,爲了保證數據的完整性,必須有鎖的介入。數據庫
InnoDB存儲引擎鎖的實現與Oracle相似,提供一致性的非鎖定讀、行級鎖支持。併發
有多少種數據庫,就可能有多少種鎖的實現方法。異步
共享鎖(S Lock),容許事務讀一行數據。spa
排他鎖(X Lock),容許事務刪除或者更新一行數據。日誌
show engine innodb status; information_schame下的表innodb_trx、innodb_locks、innodb_lock_waits ( mysql> select * from innodb_trx\G ### 只顯示了當前運行的innodb事務 mysql> select * from innodb_locks\G ### 直接反映了鎖的一些狀況 mysql> select * from innodb_lock_waits\G ### 事務量大時,直觀反映當前事務的等待 )
例子:code
只顯示了當前運行的innodb事務,並不能直接判斷鎖的一些狀況。orm
事務trx_id=730FEE向表parent加了一個X的行鎖,
事務trx_id=7311F4向表parent申請了一個S的行鎖,
lock_date=1表示都申請表parent中主鍵=1這一行blog
事務量大時,直觀反映當前事務的等待。
InnoDB存儲引擎下,這是默認的讀取方式。即:讀取不會佔用和等待表上的鎖。
定義:若是讀取的行正在執行update或delete操做,這時讀取的操做不會所以去等待行上鎖的釋放,而是去讀取行的快照數據(該行以前的數據,經過undo段來實現;一個行記錄可能不止一個快照數據,通常稱這種技術爲多版本併發控制MVCC)。
使用:事務隔離級別read committed和repeatable read(innodb默認存儲引擎)。
RC下,對於快照數據,非一致性讀老是讀取被‘鎖定行的最新一份快照數據’。
RR下,對於快照數據,非一致性讀老是讀取‘事務開始是的行數據版本’。
例子:
時間5:RC、RR下結果id=1 ;
時間6:RC下結果爲空,RR下結果id=1。
定義:某些狀況下,用戶須要對數據庫讀取操做進行加鎖以保證數據邏輯的一致性。
加鎖語句:
select ... for update; ### 對讀取的行記錄加一個X鎖
select ... lock in share mode; ### 對讀取的行記錄加一個S鎖
說明:以上加鎖語句必須在一個事務中,當事務提交,鎖就釋放了(在使用鎖定語句時,務必加上begin,start transaction, set autocommit=0)
鎖機制會形成以下問題:
髒頁 : 在緩衝池中已經被修改的頁,可是尚未刷新到磁盤中,即:數據庫實例內存中的頁和磁盤中的頁的數據是不一致的,固然在刷新到磁盤以前,日誌已經備寫入到了重作日誌(redo log)中。
說明:對於髒頁的讀取,是很正常的。它是因爲數據庫實例內存和磁盤的異步形成的,最終髒頁會刷回磁盤,並不影響數據的一致性。
髒數據:指事務對緩衝池中行記錄的修改,而且尚未被commit。
說明:若是讀取到了髒數據,即一個事務能夠讀到另一個事務未提交的數據,這顯然違背了數據庫的隔離性。
髒讀:就是早不一樣的事務下,當前事務能夠讀到另外事務未提交的數據(read uncommited事務隔離級別下)。
不可重複讀:在同一事務中,兩次讀取同一數據,獲得內容不一樣
事務1:查詢一條記錄 -------------->事務2:更新事務1查詢的記錄 -------------->事務2:調用commit進行提交 事務1:再次查詢上次的記錄 ***此時事務1對同一數據查詢了兩次,可獲得的內容不一樣,稱爲不可重複讀
不可重複讀與髒讀的區別:髒讀是讀到未提交的數據,而不可重複讀讀到的倒是已經提交的數據,可是違反了一致性的要求。
幻讀:同一事務中,用一樣的操做讀取兩次,獲得的記錄數不相同
事務1:查詢表中全部記錄 -------------->事務2:插入一條記錄 -------------->事務2:調用commit進行提交 事務1:再次查詢表中全部記錄 ***此時事務1兩次查詢到的記錄是不同的,稱爲幻讀
詳細解釋:幻讀是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,這種修改涉及到表中的所有數據行。同時,第二個事務也修改這個表中的數據,這種修改是向表中插入一行新數據。那麼,之後就會發生操做第一個事務的用戶發現表中還有沒有修改的數據行,就好象發生了幻覺同樣。
不可重複讀與幻讀的區別不可重複讀的重點是修改:一樣的條件, 你讀取過的數據,再次讀取出來發現值不同了幻讀的重點在於新增或者刪除:一樣的條件, 第 1 次和第 2 次讀出來的記錄數不同