Atomic Consistent? Isolated? Durable
An atomic
database transaction is one which is guaranteed to complete successfully or not at all. If an error prevents a partially-performed transaction from proceeding to completion, it must be "backed out" to prevent the database being left in an inconsistent state.
ACID?is?an?acronym?used?to?describe?the?properties?that?a?transaction?should?have?in?an?enterprise?environment.?A?transaction?should?be?Atomic,?and?its?results?should?be?Consistent,?Isolated,?and?Durable.?A?transaction?is?Atomic?if?it?either?completes?itself?or?is?completely?undone.?The?results?of?a?transaction?should?consistently?change?the?system?from?one?state?to?another,?be?isolated?or?independent?of?one?another,?and,?once?completed,?be?durable?or?permanent. 什么是事務(wù)
???事務(wù)是應(yīng)用程序中一系列嚴(yán)密的操作,所有操作必須成功完成,否則在每個(gè)操作中所作的所有更改都會(huì)被撤消。也就是事務(wù)具有原子性,一個(gè)事務(wù)中的一系列的操作要么全部成功,要么一個(gè)都不做。???
???事務(wù)的結(jié)束有兩種,當(dāng)事務(wù)中的所以步驟全部成功執(zhí)行時(shí),事務(wù)提交。如果其中一個(gè)步驟失敗,將發(fā)生回滾操作,撤消撤消之前到事務(wù)開始時(shí)的所以操作。
事務(wù)的ACID
事務(wù)具有四個(gè)特征:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持續(xù)性(Durability)。這四個(gè)特性簡(jiǎn)稱為ACID特性。
????
1、原子性
??? 事務(wù)是數(shù)據(jù)庫的邏輯工作單位,事務(wù)中包含的各操作要么都做,要么都不做
2、一致性
?????事務(wù)執(zhí)行的結(jié)果必須是使數(shù)據(jù)庫從一個(gè)一致性狀態(tài)變到另一個(gè)一致性狀態(tài)。因此當(dāng)數(shù)據(jù)庫只包含成功事務(wù)提交的結(jié)果時(shí),就說數(shù)據(jù)庫處于一致性狀態(tài)。如果數(shù)據(jù)庫系統(tǒng)運(yùn)行中發(fā)生故障,有些事務(wù)尚未完成就被迫中斷,這些未完成事務(wù)對(duì)數(shù)據(jù)庫所做的修改有一部分已寫入物理數(shù)據(jù)庫,這時(shí)數(shù)據(jù)庫就處于一種不正確的狀態(tài),或者說是不一致的狀態(tài)。?
3、隔離性
??? 一個(gè)事務(wù)的執(zhí)行不能其它事務(wù)干擾。即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對(duì)其它并發(fā)事務(wù)是隔離的,并發(fā)執(zhí)行的各個(gè)事務(wù)之間不能互相干擾。
4、持續(xù)性
?? 也稱永久性,指一個(gè)事務(wù)一旦提交,它對(duì)數(shù)據(jù)庫中的數(shù)據(jù)的改變就應(yīng)該是永久性的。接下來的其它操作或故障不應(yīng)該對(duì)其執(zhí)行結(jié)果有任何影響。
事務(wù)的屬性
???
一個(gè)事務(wù)的屬性控制了事務(wù)的使用范圍。EJB、Spring以及.net下的事務(wù)屬性都很類似的,事務(wù)屬性有如下幾種:
???Required:
??????如果在一個(gè)事務(wù)中調(diào)用,就把該方法加到此事務(wù)中來,如果還沒有啟動(dòng)事務(wù),就啟動(dòng)一個(gè)新事務(wù)。
?? RequiredNew:
不管當(dāng)前有沒有事務(wù),都會(huì)啟動(dòng)一個(gè)新事務(wù),如果當(dāng)前有事務(wù),會(huì)被掛起直到方法結(jié)束。
NotSupported:
不能在事務(wù)中執(zhí)行此方法。如果有事務(wù),將會(huì)被掛起直到方法結(jié)束。
Supports:
如果當(dāng)前有事務(wù),此方法會(huì)加到當(dāng)前事務(wù),如果沒有,容器也不會(huì)啟動(dòng)新事務(wù)。
Mandatory:
必須在事務(wù)中調(diào)用此方法,否則拋出異常。
Never:
必須不在事務(wù)中調(diào)用此方法,否則拋出異常。
三.事務(wù)的回滾
CMT在以下兩中情況下,事務(wù)將回滾。第一,如果產(chǎn)生一個(gè)系統(tǒng)異常,容器將自動(dòng)回滾該事務(wù)。第二,通過調(diào)用EJBContext接口SetRollbackOnly方法,Bean方法通知容器回滾該事務(wù)。如果Bean拋出一個(gè)應(yīng)用異常,事務(wù)將不會(huì)自動(dòng)回滾,但可以調(diào)用SetRollbackOnly回滾。
五.隔離級(jí)別
事務(wù)不僅保證事務(wù)界限內(nèi)的數(shù)據(jù)庫操作全部完成(或回滾)同時(shí)還隔離數(shù)據(jù)庫更新語句。隔離級(jí)別描述被修改的數(shù)據(jù)對(duì)其他事物的可見度。隔離級(jí)別的控制會(huì)跟具體的DBMS廠商不同而不同。
??? ?隔離級(jí)別與并發(fā)性是互為矛盾的:隔離程度越高,數(shù)據(jù)庫的并發(fā)性越差;隔離程度越低,數(shù)據(jù)庫的并發(fā)性越好。
通過一些現(xiàn)象,可以反映出隔離級(jí)別的效果。這些現(xiàn)象有:
l???????? 更新丟失(lost update):當(dāng)系統(tǒng)允許兩個(gè)事務(wù)同時(shí)更新同一數(shù)據(jù)是,發(fā)生更新丟失。
l???????? 臟讀(dirty read):當(dāng)一個(gè)事務(wù)讀取另一個(gè)事務(wù)尚未提交的修改時(shí),產(chǎn)生臟讀。
l???????? 非重復(fù)讀(nonrepeatable read):同一查詢?cè)谕皇聞?wù)中多次進(jìn)行,由于其他提交事務(wù)所做的修改或刪除,每次返回不同的結(jié)果集,此時(shí)發(fā)生非重復(fù)讀。
l???????? 幻像讀(phantom read):同一查詢?cè)谕皇聞?wù)中多次進(jìn)行,由于其他提交事務(wù)所做的插入操作,每次返回不同的結(jié)果集,此時(shí)發(fā)生幻像讀。
?
SQL-99 標(biāo)準(zhǔn)定義了下列隔離級(jí)別:
l???????? 未提交讀(read uncommitted)(隔離事務(wù)的最低級(jí)別,只能保證不讀取物理上損壞的數(shù)據(jù))
l???????? 已提交讀(read committed)(數(shù)據(jù)庫引擎?的默認(rèn)級(jí)別)當(dāng)一個(gè)事務(wù)運(yùn)行在這個(gè)隔離級(jí)別時(shí),一個(gè) SELECT 查詢只能看到查詢開始之前提交的數(shù)據(jù),而永遠(yuǎn)無法看到未提交的數(shù)據(jù),或者是在查詢執(zhí)行時(shí)其他并行的事務(wù)提交做的改變。
l???????? 可重復(fù)讀(repeatable read),不會(huì)臟讀和非重復(fù)讀,可能發(fā)生幻像讀
l???????? 可序列化(serializable)(隔離事務(wù)的最高級(jí)別,事務(wù)之間完全隔離)