數(shù)據(jù)庫中的事務(wù)理論
事務(wù)的特征(ACID)
- 原子性
要么一起成功要么一起失敗
- 一致性
一致性是指事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另一個一致性狀態(tài)磁玉,也就是說一個事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)软啼。
- 隔離性
隔離性是當(dāng)多個用戶并發(fā)訪問數(shù)據(jù)庫時毅厚,比如操作同一張表時,數(shù)據(jù)庫為每一個用戶開啟的事務(wù),不能被其他事務(wù)的操作所干擾,多個并發(fā)事務(wù)之間要相互隔離。
- 持久性
持久性是指一個事務(wù)一旦被提交了窜护,那么對數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久性的效斑,即便是在數(shù)據(jù)庫系統(tǒng)遇到故障的情況下也不會丟失提交事務(wù)的操作。
數(shù)據(jù)庫中3種常見問題
臟讀:臟讀就是指當(dāng)一個事務(wù)正在訪問數(shù)據(jù)柱徙,并且對數(shù)據(jù)進行了修改缓屠,而這種修改還沒有提交到數(shù)據(jù)庫中,這時护侮,另外一個事務(wù)也訪問這個數(shù)據(jù)敌完,然后使用了這個數(shù)據(jù)。
不可重復(fù)讀 :是指在一個事務(wù)內(nèi)羊初,多次讀同一數(shù)據(jù)滨溉。在這個事務(wù)還沒有結(jié)束時,另外一個事務(wù)也訪問該同一數(shù)據(jù)长赞。那么晦攒,在第一個事務(wù)中的兩 次讀數(shù)據(jù)之間,由于第二個事務(wù)的修改得哆,那么第一個事務(wù)兩次讀到的的數(shù)據(jù)可能是不一樣的脯颜。這樣就發(fā)生了在一個事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是不一樣的,因此稱為是不 可重復(fù)讀等太。例如抗愁,一個編輯人員兩次讀取同一文檔谭期,但在兩次讀取之間,作者重寫了該文檔矾芙。當(dāng)編輯人員第二次讀取文檔時,文檔已更改近上。原始讀取不可重復(fù)蠕啄。如果 只有在作者全部完成編寫后編輯人員才可以讀取文檔,則可以避免該問題戈锻。
幻讀 : 是指當(dāng)事務(wù)不是獨立執(zhí)行時發(fā)生的一種現(xiàn)象歼跟,例如第一個事務(wù)對一個表中的數(shù)據(jù)進行了修改,這種修改涉及到表中的全部數(shù)據(jù)行格遭。 同時哈街,第二個事務(wù)也修改這個表中的數(shù)據(jù),這種修改是向表中插入一行新數(shù)據(jù)拒迅。那么骚秦,以后就會發(fā)生操作第一個事務(wù)的用戶發(fā)現(xiàn)表中還有沒有修改的數(shù)據(jù)行她倘,就好象 發(fā)生了幻覺一樣。例如作箍,一個編輯人員更改作者提交的文檔硬梁,但當(dāng)生產(chǎn)部門將其更改內(nèi)容合并到該文檔的主復(fù)本時,發(fā)現(xiàn)作者已將未編輯的新材料添加到該文檔中胞得。 如果在編輯人員和生產(chǎn)部門完成對原始文檔的處理之前荧止,任何人都不能將新材料添加到文檔中,則可以避免該問題阶剑。
4種隔離級別
數(shù)據(jù)庫事務(wù)的隔離級別有4個跃巡,由低到高依次為
- Read uncommitted
可能出現(xiàn)臟讀和不可重復(fù)讀和幻讀
- Read committed
可能出現(xiàn)不可重復(fù)讀和幻讀
保證一個事務(wù)修改的數(shù)據(jù)提交后才能被另外一個事務(wù)讀取。另外一個事務(wù)不能讀取該事務(wù)未提交的數(shù)據(jù)
這是大多數(shù)數(shù)據(jù)庫系統(tǒng)的默認(rèn)隔離級別(但不是MySQL默認(rèn)的)
它滿足了隔離的簡單定義:一個事務(wù)只能看見已經(jīng)提交事務(wù)所做的改變
這種隔離級別出現(xiàn)的問題是——不可重復(fù)讀(Nonrepeatable Read):不可重復(fù)讀意味著我們在同一個事務(wù)中執(zhí)行完全相同的select語句時可能看到不一樣的結(jié)果牧愁。
- Repeatable read
可能出現(xiàn)幻讀
這種事務(wù)隔離級別可以防止臟讀素邪,不可重復(fù)讀。但是可能出現(xiàn)幻像讀猪半。
它除了保證一個事務(wù)不能讀取另一個事務(wù)未提交的數(shù)據(jù)外兔朦,還保證了避免下面的情況產(chǎn)生(不可重復(fù)讀)。
- Serializable
這是花費最高代價但是最可靠的事務(wù)隔離級別磨确。事務(wù)被處理為順序執(zhí)行烘绽。除了防止臟讀,不可重復(fù)讀外俐填,還避免了幻像讀安接。
7種傳播行為
-
PROPAGATION_REQUIRED:
如果當(dāng)前沒有事務(wù),就創(chuàng)建一個新事務(wù)英融,如果當(dāng)前存在事務(wù)盏檐,就加入該事務(wù),該設(shè)置是最常用的設(shè)置驶悟。
- PROPAGATION_SUPPORTS:支持當(dāng)前事務(wù)胡野,如果當(dāng)前存在事務(wù),就加入該事務(wù)痕鳍,如果當(dāng)前不存在事務(wù)硫豆,就以非事務(wù)執(zhí)行×簦‘
- PROPAGATION_MANDATORY:支持當(dāng)前事務(wù)熊响,如果當(dāng)前存在事務(wù),就加入該事務(wù)诗赌,如果當(dāng)前不存在事務(wù)汗茄,就拋出異常。
- PROPAGATION_REQUIRES_NEW:創(chuàng)建新事務(wù)铭若,無論當(dāng)前存不存在事務(wù)洪碳,都創(chuàng)建新事務(wù)递览。
- PROPAGATION_NOT_SUPPORTED:以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù)瞳腌,就把當(dāng)前事務(wù)掛起绞铃。
- PROPAGATION_NEVER:以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù)嫂侍,則拋出異常儿捧。
- PROPAGATION_NESTED:如果當(dāng)前有事務(wù),就嵌套在事務(wù)內(nèi)執(zhí)行吵冒,如果沒有事務(wù),就執(zhí)行與PROPAGATION_REQUIRED相似的操作西剥。