1. 程式人生 > 其它 >3.4鎖機制、事務

3.4鎖機制、事務

MySQL鎖機制

鎖:

  讀鎖:共享鎖,也稱為s鎖,只讀不可寫,包括當前事務,多個讀互不阻塞

  寫鎖:獨佔鎖,排它鎖,也稱為X鎖,寫鎖會阻塞其它事務(不包括當前事務)的讀和寫

舉例:

  讀鎖和讀鎖是相容的,寫鎖和其它鎖不相容

  事務T1獲取了一個行r1的讀鎖,另外事務T2可以立即獲得r1的讀鎖,此時T1和T2共同獲得行r1的讀鎖,此種情況成為鎖相容

  但是另外一個事務T3如果想獲得行r1的寫鎖,則必須等待T1對行r1讀鎖的釋放,此種情況也成為鎖衝突。

鎖粒度:

  表級鎖:MyISAM

     行級鎖:InnoDB

實現:

  儲存引擎:自行實現其鎖策略和鎖粒度

  伺服器級:實現了鎖,表級鎖,使用者可顯示請求

分類:

  隱式鎖:由儲存引擎自動施加鎖

  顯式鎖:使用者手動請求

鎖策略:在鎖粒度及資料安全性尋求的平衡機制

鎖優缺點:

  表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的概率最高,併發度最低。

  行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。

  頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度一般

對錶date加讀鎖:lock table date read;

對錶date加寫鎖:lock table date write;

事務:

有事務之前:

  資料庫修改一條資料是直接在記憶體中修改然後寫入資料庫檔案

有事務之後:

  資料庫修改的資料先存入事務日誌(告訴使用者成功),然後再存入資料庫檔案

  日誌是順序寫的,更快(更詳細),資料庫是隨機讀寫

 什麼是事務:

  事務Transactions:一組原子性的SQL語句,或一個獨立工作單元   事務日誌:記錄事務資訊,實現undo,redo等故障恢復功能

事務特性

  ACID特性:   A:atomicity原子性;整個事務中的所有操作要麼全部成功執行,要麼全部失敗後回滾   C:consistency一致性;資料庫總是從一個一致性狀態轉換為另一個一致性狀態   I:Isolation隔離性;一個事務所做出的操作在提交之前,是不能為其它事務所見;隔離有多種隔離級別,實現併發   D:durability永續性;一旦事務提交,其所做的修改會永久保存於資料庫中 事務生命週期

 管理事務

顯示啟動事務

BEGIN

BEGIN WORK

START TRANSCATION

結束事務

COMMIT  #提交

ROLLBACK  #回滾

注意:只有事務型儲存引擎中的DML語句才能支援此類操作

自動提交:set autocommit={1|0}

預設為1,為0時非自動提交

事務支援儲存點

savepoint identifier

rollback work to savepoint identifiter

release savepoint identifiter

檢視事務

檢視當前正在進行的事務:select * frominformation_schema.innodb_trx;

檢視當前鎖定的事務:select * frominformation_schema.innodb_locks;

檢視當前等鎖的事務:select * frominformation_schema.innodb_lock_waits;

檢視事務鎖的超時時長,預設為50S:show global variables like 'innodb_lock_wait_timeout';

MySQL支援四種隔離級別,事務隔離級別:從上至下更加嚴格

隔離級別 髒讀 不可重複讀 幻讀 加讀鎖
讀未提交 可以出現 可以出現 可以出現
讀提交 不允許出現 可以出現 可以出現
可重複讀 不允許出現 不允許出現 可以出現
序列化 不允許出現 不允許出現 可以出現

READ UNCOMMITTED
  可讀取到未提交資料,產生髒讀
READ COMMITTED
  可讀取到提交資料,但未提交資料不可讀,產生不可重複讀,即可讀取到多個提交資料,導致每次讀取資料不一致
REPEATABLE READ
  可重複讀,多次讀取資料都一致,產生幻讀,即讀取過程中,即使有其它提交的事務修改資料,仍只能讀取到未修改前的舊資料。此為MySQL預設設定
SERIALIZABLE
可序列化,未提交的讀事務阻塞修改事務(加讀鎖,但不阻塞讀事務),或者未提交的修改事務阻塞讀事務(加寫鎖,其它事務的讀,寫都不可以執行)。會導致併發效能差
MVCC和事務的隔離級別:
MVCC(多版本併發控制機制)只在REPEATABLE READ和READ COMMITTED兩個隔離級別下工作。其他兩個隔離級別都和MVCC不相容,因為READ UNCOMMITTED總是讀取最新的資料行,而不是符合當前事務版本的資料行。而SERIALIZABLE則會對所有讀取的行都加鎖