介紹
事務(wù)(Transaction)是數(shù)據(jù)庫用來保證數(shù)據(jù)的完整性---要么都做修改,要么都不做召噩。
特性:ACID
- 原子性(atomicity):事務(wù)是不可分割的工作的單位敷鸦。
- 一致性(consistency):事務(wù)將數(shù)據(jù)庫從一種狀態(tài)轉(zhuǎn)變?yōu)橄乱环N狀態(tài)
- 隔離性(isolation):多個事務(wù)并發(fā)執(zhí)行,單獨不影響
- 持久性(durability):提交的事務(wù)的結(jié)果或效果的系統(tǒng)出現(xiàn)故障的情況下仍然存在
實現(xiàn)
事務(wù)隔離性由鎖實現(xiàn)万矾;原子性伤疙、一致性银酗、持久性通過數(shù)據(jù)庫的redo和undo實現(xiàn)
1 redo
記錄的是新數(shù)據(jù)的備份。在事務(wù)提交前徒像,只要將Redo Log持久化即可黍特,不需要將數(shù)據(jù)持久化。當系統(tǒng)崩潰時锯蛀,雖然數(shù)據(jù)沒有持久化灭衷,但是RedoLog已經(jīng)持久化。系統(tǒng)可以根據(jù)RedoLog的內(nèi)容旁涤,將所有數(shù)據(jù)恢復到最新的狀態(tài)
2 undo
Undo Log 是為了實現(xiàn)事務(wù)的原子性翔曲,在MySQL數(shù)據(jù)庫InnoDB存儲引擎中,還用Undo Log來實現(xiàn)多版本并發(fā)控制(簡稱:MVCC)
在操作任何數(shù)據(jù)之前劈愚,首先將數(shù)據(jù)備份到一個地方(這個存儲數(shù)據(jù)備份的地方稱為UndoLo)瞳遍。然后進行數(shù)據(jù)的修改。如果出現(xiàn)了錯誤或者用戶執(zhí)行了ROLLBACK語句菌羽,系統(tǒng)可以利用UndoLog中的備份將數(shù)據(jù)恢復到事務(wù)開始之前的狀態(tài)
事務(wù)控制語句
在mysql命令行的默認下掠械,事務(wù)都是自動提交的,sql語句提交后馬上會執(zhí)行commit操作。因此開啟一個事務(wù)必須使用begin猾蒂,start transaction均唉,或者執(zhí)行 set autocommit=0,已禁用當前會話的自動提交
事務(wù)控制語句:
- start transction | begin : 顯示的開啟一個事務(wù)
- commit 事務(wù)提交
- rollback 事務(wù)回滾
事務(wù)隔離級別
SQL標準定義了4類隔離級別肚菠,包括了一些具體規(guī)則浸卦,用來限定事務(wù)內(nèi)外的哪些改變是可見的,哪些是不可見的案糙。低級別的隔離級一般支持更高的并發(fā)處理,并擁有更低的系統(tǒng)開銷
Read Uncommitted(讀取未提交內(nèi)容)
在該隔離級別靴庆,所有事務(wù)都可以看到其他未提交事務(wù)的執(zhí)行結(jié)果时捌。本隔離級別很少用于實際應用,因為它的性能也不比其他級別好多少炉抒。讀取未提交的數(shù)據(jù)奢讨,也被稱之為臟讀(Dirty Read)
Read Committed(讀取提交內(nèi)容)
這是大多數(shù)數(shù)據(jù)庫系統(tǒng)的默認隔離級別(但不是MySQL默認的)。它滿足了隔離的簡單定義:一個事務(wù)只能看見已經(jīng)提交事務(wù)所做的改變焰薄。這種隔離級別 也支持所謂的不可重復讀(Nonrepeatable Read)拿诸,因為同一事務(wù)的其他實例在該實例處理其間可能會有新的commit,所以同一select可能返回不同結(jié)果
Repeatable Read(可重讀)
這是MySQL的默認事務(wù)隔離級別塞茅,它確保同一事務(wù)的多個實例在并發(fā)讀取數(shù)據(jù)時亩码,會看到同樣的數(shù)據(jù)行。不過理論上野瘦,這會導致另一個棘手的問題:幻讀 (Phantom Read)描沟。簡單的說,幻讀指當用戶讀取某一范圍的數(shù)據(jù)行時鞭光,另一個事務(wù)又在該范圍內(nèi)插入了新行吏廉,當用戶再讀取該范圍的數(shù)據(jù)行時,會發(fā)現(xiàn)有新的“幻影” 行惰许。InnoDB和Falcon存儲引擎通過多版本并發(fā)控制(MVCC席覆,Multiversion Concurrency Control)機制解決了該問題。
Serializable(可串行化) 這是最高的隔離級別汹买,它通過強制事務(wù)排序佩伤,使之不可能相互沖突,從而解決幻讀問題晦毙。簡言之畦戒,它是在每個讀的數(shù)據(jù)行上加上共享鎖。在這個級別结序,可能導致大量的超時現(xiàn)象和鎖競爭