并發(fā)控制
鎖粒度:
- 表級鎖
- 行級鎖
鎖:
- 讀鎖:共享鎖,只讀不可寫,多個讀互相不阻塞
- 寫鎖:獨占鎖,排它鎖,一個寫鎖會阻塞其它讀和寫鎖
實現(xiàn):
- 存儲引擎:自行實現(xiàn)其鎖策略和鎖粒度
- 服務(wù)器級:實現(xiàn)了鎖,表級鎖;用戶可顯式請求
分類:
- 隱式鎖:由存儲引擎自動施加鎖
- 顯式鎖:用戶手動請求
鎖策略:
在鎖粒度及數(shù)據(jù)安全性尋求的平衡機制
顯示使用鎖:
- 加鎖
LOCK TABLES tbl_name [[AS] alias] lock_type [,tbl_name [[AS] alias] lock_type] ...lock_type:READ,WRITE - 解鎖
UNLOCK TABLES - 關(guān)閉正在打開的表(清除查詢緩存),通常在備份前加全局讀鎖
FLUSH TABLES tb_name[,...] [WITH READ LOCK] - 查詢時加寫或讀鎖
SELECT clause [FOR UPDATE | LOCK IN SHARE MODE]
死鎖:
兩個或多個事務(wù)在同一資源相互占用,并請求鎖定對方占用的資源的狀態(tài)
事務(wù)
事務(wù)Transactions:
一組原子性的SQL語句,或一個獨立工作單元
事務(wù)日志:
記錄事務(wù)信息,實現(xiàn)undo,redo等故障恢復功能
- 事務(wù)日志的寫入類型為“追加”,因此其操作為“順序I/O”;通常也被稱為:預寫式日志 write ahead logging
- 日志文件:ib_logfile0,ib_logfile1
ACID特性:
- A:atomicity原子性;整個事務(wù)中的所有操作要么全部成功執(zhí)行,要么全部失敗后回滾
- C:consistency一致性;數(shù)據(jù)庫總是從一個一致性狀態(tài)轉(zhuǎn)換為另一個一致性狀態(tài)
- I:Isolation隔離性;一個事務(wù)所做出的操作在提交之前,是不能為其它事務(wù)所見;隔離有多種隔離級別,實現(xiàn)并發(fā)
- D:durability持久性;一旦事務(wù)提交,其所做的修改會永久保存于數(shù)據(jù)庫中
啟動事務(wù):
START TRANSACTION
結(jié)束事務(wù):
- COMMIT:提交
- ROLLBACK:回滾
注意:只有事務(wù)型存儲引擎方能支持此類操作
建議:顯式請求和提交事務(wù),而不要使用“自動提交”功能
set autocommit={1|0}
事務(wù)支持保存點:savepoint
SAVEPOINT identifier
ROLLBACK [WORK] TO [SAVEPOINT] identifier
RELEASE SAVEPOINT identifier
事務(wù)隔離級別:從上至下更加嚴格
- READ UNCOMMITTED:可讀取到未提交數(shù)據(jù),產(chǎn)生臟讀
- READ COMMITTED:可讀提交數(shù)據(jù),但未提交數(shù)據(jù)不可讀,產(chǎn)生不可重復讀,即可讀取到多個提交數(shù)據(jù),導致每次讀取數(shù)據(jù)不一致
- REPEATABLE READ:可重復讀,多次讀取數(shù)據(jù)都一致,產(chǎn)生幻讀,即讀取過程中,即使有其它提交的事務(wù)修改數(shù)據(jù),仍只能讀取到未修改前的舊數(shù)據(jù),此為MySQL默認設(shè)置
- SERIALIZABILE:可串行化,未提交的讀事務(wù)阻塞修改事務(wù),或者未提交的修改事務(wù)阻塞讀事務(wù)。導致并發(fā)性能差
| 事務(wù)隔離級別 | 臟讀可能性 | 不可重復讀可能性 | 幻讀可能性 | 加鎖讀 |
|---|---|---|---|---|
| 讀未提交(read-uncommitted) | 是 | 是 | 是 | 否 |
| 不可重復讀(read-committed) | 否 | 是 | 是 | 否 |
| 可重復讀(repeatable-read) | 否 | 否 | 是 | 否 |
| 串行化(serializable) | 否 | 否 | 否 | 是 |
MVCC:多版本并發(fā)控制,和事務(wù)級別相關(guān)
指定事務(wù)隔離級別:
- 服務(wù)器變量tx_isolation指定,默認為REPEATABLE-READ,可在GLOBAL和SESSION級進行設(shè)置
SET tx_isolation='' READ-UNCOMMITTED READ-COMMITTED REPEATABLE-READ SERIALIZABLE - 服務(wù)器選項中指定
vim /etc/my.cnf [mysqld] transaction-isolation=SERIALIZABLE