事務(wù)
事務(wù)就是一組原子性的SQL查詢履恩,或者說一個獨(dú)立的工作單元菇爪。如果數(shù)據(jù)庫引擎能夠成功的對數(shù)據(jù)庫應(yīng)用改組查詢的全部語句朴下,那么就執(zhí)行該組查詢镜雨。如果其中有任何一條語句因為崩潰或其他原因無法執(zhí)行囱嫩,那么所有語句都不會執(zhí)行恃疯。也就是說事務(wù)內(nèi)的語句,要么全部執(zhí)行成功墨闲,要么全部執(zhí)行失敗今妄。
事務(wù)的ACID特性
一個運(yùn)行良好的事務(wù)處理系統(tǒng),必須具備ACID特性鸳碧。
- 原子性(atomicity):一個事務(wù)必須被視為一個不可分割的最小工作單元盾鳞,整個事務(wù)中的所有操作要么全部提交成功,要么全部失敗回滾瞻离,對于一個事務(wù)來說腾仅,不可能只執(zhí)行其中的一部分操作,這就是事務(wù)的原子性套利。
- 一致性(consistency):數(shù)據(jù)庫總是從一個一致性的狀態(tài)轉(zhuǎn)換到另一個一致性的狀態(tài)推励。拿銀行轉(zhuǎn)賬事務(wù)來說,就算中間失敗了肉迫。也會回滾不會導(dǎo)致數(shù)據(jù)的不正確验辞。
- 隔離性(isolation):通常來說,一個事務(wù)所做的修改在最終提交之前昂拂,對其他事務(wù)是不可見的受神。也就是說一個事務(wù)的執(zhí)行不會影響到另一個事務(wù)的一致性。后邊會有詳細(xì)的關(guān)于隔離性的隔離級別格侯。
- 持久性(durability):一旦事務(wù)提交鼻听,其所做的修改就要永久的保存到數(shù)據(jù)庫中。此時就算系統(tǒng)崩潰联四,也要保證修改后的數(shù)據(jù)不能丟失撑碴。
隔離級別
- READ UNCOMMITTED(未提交讀):
在READ UNCOMMITTED級別,事務(wù)中的修改朝墩,即使沒有提交醉拓,對其他事務(wù)也是可見的。事務(wù)可以讀取未提交的數(shù)據(jù),這也可以稱為是臟讀亿卤。這個級別會出現(xiàn)很多問題愤兵。從性能上來說。READ UNCOMMITTED不會比其他級別好太多排吴,并且缺乏其他好處秆乳。這個隔離級別應(yīng)用非常少 - READ COMMITTED(提交讀):
oracle系統(tǒng)默認(rèn)的隔離級別是READ COMMITTED,READ COMMITTED滿足前邊提到的隔離性的定義:一個事務(wù)開始時钻哩,只能看見已經(jīng)提交的事務(wù)所做的修改屹堰。換句話說,一個事務(wù)從開始直到提交前街氢,所做的任何修改對其他事務(wù)都是不可見的扯键。這個級別也叫不可重復(fù)讀,因為一個事務(wù)中讀取的數(shù)據(jù)可能因為別的事務(wù)兩次修改而看到不一樣的結(jié)果珊肃。 - REPEATABLE READ(可重復(fù)讀):
mysql系統(tǒng)默認(rèn)的隔離級別是REPEATABLE READ荣刑,REPEATABLE READ解決了臟讀的問題,同樣也解決了不可重復(fù)讀的問題近范。
但是出現(xiàn)了幻讀的問題嘶摊。幻讀:指的是當(dāng)某個事務(wù)在讀取某個范圍的數(shù)據(jù)時评矩,另外一個事務(wù)在該范圍內(nèi)插入了一條新的記錄。當(dāng)之前的事務(wù)再次讀取該范圍的記錄時阱飘,會多出這一條數(shù)據(jù)斥杜。 -
SERIALIZABLE(可串行化):
SERIALIZABLE是最高的隔離級別。它通過強(qiáng)制事務(wù)串行執(zhí)行沥匈,避免了前邊所出現(xiàn)的幻讀問題蔗喂。簡單來說,SERIALIZABLE會在讀取每一條數(shù)據(jù)都加鎖高帖。所以可能導(dǎo)致大量的超時和鎖爭用問題缰儿。實際開發(fā)中,很少用到這種隔離級別散址。