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則會對所有讀取的行都加鎖