事務(wù)的四個(gè)屬性:原子性(atomicity)、一致性(consistency)、隔離性(isolation)和持久性(durability)。
1.原子性(Atomic)
最重要的原則,也是最容易理解的原則。被事務(wù)管理的所有方法,要么一起被提交,要么一起回滾。
2.一致性(Consistency)
事務(wù)在系統(tǒng)完整性中實(shí)施一致性,如果事務(wù)成功地完成,那么系統(tǒng)中所有變化將正確地應(yīng)用,系統(tǒng)處于新有效狀態(tài)。如果在事務(wù)中出現(xiàn)錯(cuò)誤,那么系統(tǒng)中的所有變化將自動(dòng)地回滾,系統(tǒng)返回到原始狀態(tài)。
3.隔離性(Isolation)
在隔離狀態(tài)執(zhí)行事務(wù),使它們好像是系統(tǒng)在給定時(shí)間內(nèi)執(zhí)行的唯一操作。如果有兩個(gè)事務(wù),運(yùn)行在相同的時(shí)間內(nèi),執(zhí)行相同的功能,事務(wù)的隔離性將確保每一事務(wù)在系統(tǒng)中認(rèn)為只有該事務(wù)在使用系統(tǒng)。這種屬性有時(shí)稱為串行化,為了防止事務(wù)操作間的混淆,必須串行化或序列化請求,使得在同一時(shí)間僅有一個(gè)請求用于同一數(shù)據(jù)。重要的是,在隔離狀態(tài)執(zhí)行事務(wù),系統(tǒng)的狀態(tài)有可能是不一致的,在結(jié)束事務(wù)前,應(yīng)確保系統(tǒng)處于一致狀態(tài)。但是在每個(gè)單獨(dú)的事務(wù)中,系統(tǒng)的狀態(tài)可能會(huì)發(fā)生變化。如果事務(wù)不是在隔離狀態(tài)運(yùn)行,它就可能從系統(tǒng)中訪問數(shù)據(jù),而系統(tǒng)可能處于不一致狀態(tài)。通過提供事務(wù)隔離,可以阻止這類事件的發(fā)生。
4.持久性(Durability)
持久性意味著一旦事務(wù)執(zhí)行成功,在系統(tǒng)中產(chǎn)生的所有變化將是永久的。應(yīng)該存在一些檢查點(diǎn)防止在系統(tǒng)失敗時(shí)丟失信息。甚至硬件本身失敗,系統(tǒng)的狀態(tài)仍能通過在日志中記錄事務(wù)完成的任務(wù)進(jìn)行重建。
數(shù)據(jù)庫鎖概念:
在數(shù)據(jù)庫中有兩種基本的鎖類型:排它鎖(Exclusive Locks,即X鎖)和共享鎖(Share Locks,即S鎖)。當(dāng)數(shù)據(jù)對象被加上排它鎖時(shí),其他的事務(wù)不能對它讀取和修改。加了共享鎖的數(shù)據(jù)對象可以被其他事務(wù)讀取,但不能修改。數(shù)據(jù)庫利用這兩種基本的鎖類型來對數(shù)據(jù)庫的事務(wù)進(jìn)行并發(fā)控制。
從程序員的角度看,鎖分為以下兩種類型:
1.樂觀鎖(Optimistic Lock)
樂觀鎖假定在處理數(shù)據(jù)時(shí),不需要在應(yīng)用程序的代碼中做任何事情就可以直接在記錄上加鎖、即完全依靠數(shù)據(jù)庫來管理鎖的工作。一般情況下,當(dāng)執(zhí)行事務(wù)處理時(shí)SQL Server會(huì)自動(dòng)對事務(wù)處理范圍內(nèi)更新到的表做鎖定。
2.悲觀鎖(Pessimistic Lock)
悲觀鎖對數(shù)據(jù)庫系統(tǒng)的自動(dòng)管理不感冒,需要程序員直接管理數(shù)據(jù)或?qū)ο笊系募渔i處理,并負(fù)責(zé)獲取、共享和放棄正在使用的數(shù)據(jù)上的任何鎖。
事務(wù)隔離級別
一個(gè)事務(wù)必須與其它事務(wù)進(jìn)行隔離的程度。較低的隔離級別可以增加并發(fā),但代價(jià)是降低數(shù)據(jù)的正確性。相反,較高的隔離級別可以確保數(shù)據(jù)的正確性,但可能對并發(fā)產(chǎn)生負(fù)面影響。
數(shù)據(jù)庫并發(fā)操作存在的異常情況:
1. 更新丟失(Lost update):兩個(gè)事務(wù)都同時(shí)更新一行數(shù)據(jù)但是第二個(gè)事務(wù)卻中途失敗退出導(dǎo)致對數(shù)據(jù)兩個(gè)修改都失效了這是系統(tǒng)沒有執(zhí)行任何鎖操作因此并發(fā)事務(wù)并沒有被隔離開來
2. 臟讀取(Dirty Reads):一個(gè)事務(wù)開始讀取了某行數(shù)據(jù)但是另外一個(gè)事務(wù)已經(jīng)更新了此數(shù)據(jù)但沒有能夠及時(shí)提交。這是相當(dāng)危險(xiǎn)很可能所有操作都被回滾
3. 不可重復(fù)讀取(Non-repeatable Reads):一個(gè)事務(wù)對同一行數(shù)據(jù)重復(fù)讀取兩次但是卻得到了不同結(jié)果。例如在兩次讀取中途有另外一個(gè)事務(wù)對該行數(shù)據(jù)進(jìn)行了修改并提交
4. 兩次更新問題(Second lost updates problem):無法重復(fù)讀取特例,有兩個(gè)并發(fā)事務(wù)同時(shí)讀取同一行數(shù)據(jù)然后其中一個(gè)對它進(jìn)行修改提交而另一個(gè)也進(jìn)行了修改提交這就會(huì)造成第一次寫操作失效
5. 幻讀(Phantom Reads):也稱為幻像(幻影)。事務(wù)在操作過程中進(jìn)行兩次查詢,第二次查詢結(jié)果包含了第一次查詢中未出現(xiàn)的數(shù)據(jù)(這里并不要求兩次查詢SQL語句相同)這是因?yàn)樵趦纱尾樵冞^程中有另外一個(gè)事務(wù)插入數(shù)據(jù)造成的
為了避免上面出現(xiàn)幾種情況在標(biāo)準(zhǔn)SQL規(guī)范中定義了4個(gè)事務(wù)隔離級別,不同隔離級別對事務(wù)處理不同 。
1.未授權(quán)讀取(Read Uncommitted):也稱未提交讀。允許臟讀取但不允許更新丟失,如果一個(gè)事務(wù)已經(jīng)開始寫數(shù)據(jù)則另外一個(gè)數(shù)據(jù)則不允許同時(shí)進(jìn)行寫操作但允許其他事務(wù)讀此行數(shù)據(jù)。該隔離級別可以通過“排他寫鎖”實(shí)現(xiàn)。事務(wù)隔離的最低級別,僅可保證不讀取物理損壞的數(shù)據(jù)。與READ COMMITTED 隔離級相反,它允許讀取已經(jīng)被其它用戶修改但尚未提交確定的數(shù)據(jù)。
2. 授權(quán)讀取(Read Committed):也稱提交讀。允許不可重復(fù)讀取但不允許臟讀取。這可以通過“瞬間共享讀鎖”和“排他寫鎖”實(shí)現(xiàn),讀取數(shù)據(jù)的事務(wù)允許其他事務(wù)繼續(xù)訪問該行數(shù)據(jù),但是未提交寫事務(wù)將會(huì)禁止其他事務(wù)訪問該行。SQL Server 默認(rèn)的級別。在此隔離級下,SELECT 命令不會(huì)返回尚未提交(Committed) 的數(shù)據(jù),也不能返回臟數(shù)據(jù)。
3. 可重復(fù)讀取(Repeatable Read):禁止不可重復(fù)讀取和臟讀取。但是有時(shí)可能出現(xiàn)幻影數(shù)據(jù),這可以通過“共享讀鎖”和“排他寫鎖”實(shí)現(xiàn),讀取數(shù)據(jù)事務(wù)將會(huì)禁止寫事務(wù)(但允許讀事務(wù)),寫事務(wù)則禁止任何其他事務(wù)。在此隔離級下,用SELECT 命令讀取的數(shù)據(jù)在整個(gè)命令執(zhí)行過程中不會(huì)被更改。此選項(xiàng)會(huì)影響系統(tǒng)的效能,非必要情況最好不用此隔離級。
4. 串行(Serializable):也稱可串行讀。提供嚴(yán)格的事務(wù)隔離,它要求事務(wù)序列化執(zhí)行,事務(wù)只能一個(gè)接著一個(gè)地執(zhí)行,但不能并發(fā)執(zhí)行。如果僅僅通過“行級鎖”是無法實(shí)現(xiàn)事務(wù)序列化的,必須通過其他機(jī)制保證新插入的數(shù)據(jù)不會(huì)被剛執(zhí)行查詢操作事務(wù)訪問到。事務(wù)隔離的最高級別,事務(wù)之間完全隔離。如果事務(wù)在可串行讀隔離級別上運(yùn)行,則可以保證任何并發(fā)重疊事務(wù)均是串行的。
隔離級別 |
更新丟失 |
臟讀取 |
重復(fù)讀取 |
幻讀 |
未授權(quán)讀取 |
N |
Y |
Y |
Y |
授權(quán)讀取 |
N |
N |
Y |
Y |
可重復(fù)讀取 |
N |
N |
N |
Y |
串行 |
N |
N |
N |
N |
Blog :
http://agapple.javaeye.com/ 歡迎訪問