?????? 數(shù)據(jù)庫的事務(wù)處理是在進行數(shù)據(jù)庫應(yīng)用開發(fā)中必須進行處理的一個問題。那么對于選擇Hibernate作為持久層組件,了解Hibernate的事務(wù)處理機制就顯得尤為重要了。
事務(wù)的基本概念
?????? 事務(wù)(Transaction)是并發(fā)控制的基本單位。所謂的事務(wù),它是一個操作序列,這些操作要么都執(zhí)行,要么都不執(zhí)行,它是一個不可分割的工作單位。例如,銀行轉(zhuǎn)賬工作:從一個賬號扣款并使另一個賬號增款,這兩個操作要么都執(zhí)行,要么都不執(zhí)行。所以,應(yīng)該把它們看成一個事務(wù)。事務(wù)是數(shù)據(jù)庫維護數(shù)據(jù)一致性的單位,在每個事務(wù)結(jié)束時,都能保持數(shù)據(jù)一致性。
?????? 針對上面的描述可以看出,事務(wù)的提出主要是為了解決并發(fā)情況下保持數(shù)據(jù)一致性的問題。
?????? 事務(wù)具有以下4個基本特征。
●?? Atomic(原子性):事務(wù)中包含的操作被看做一個邏輯單元,這個邏輯單元中的操作要么全部成功,要么全部失敗。
●?? Consistency(一致性):只有合法的數(shù)據(jù)可以被寫入數(shù)據(jù)庫,否則事務(wù)應(yīng)該將其回滾到最初狀態(tài)。
●?? Isolation(隔離性):事務(wù)允許多個用戶對同一個數(shù)據(jù)進行并發(fā)訪問,而不破壞數(shù)據(jù)的正確性和完整性。同時,并行事務(wù)的修改必須與其他并行事務(wù)的修改相互獨立。
●?? Durability(持久性):事務(wù)結(jié)束后,事務(wù)處理的結(jié)果必須能夠得到固化。
?????? 數(shù)據(jù)庫肯定是要被廣大客戶所共享訪問的,那么在數(shù)據(jù)庫操作過程中很可能出現(xiàn)以下幾種不確定情況。
●?? 更新丟失(Lost update):兩個事務(wù)都同時更新一行數(shù)據(jù),但是第二個事務(wù)卻中途失敗退出,導致對數(shù)據(jù)的兩個修改都失效了。這是因為系統(tǒng)沒有執(zhí)行任何的鎖操作,因此并發(fā)事務(wù)并沒有被隔離開來。
●?? 臟讀取(Dirty Reads):一個事務(wù)開始讀取了某行數(shù)據(jù),但是另外一個事務(wù)已經(jīng)更新了此數(shù)據(jù)但沒有能夠及時提交。這是相當危險的,因為很可能所有的操作都被回滾。
●?? 不可重復(fù)讀取(Non-repeatable Reads):一個事務(wù)對同一行數(shù)據(jù)重復(fù)讀取兩次,但是卻得到了不同的結(jié)果。例如,在兩次讀取的中途,有另外一個事務(wù)對該行數(shù)據(jù)進行了修改,并提交。
●?? 兩次更新問題(Second lost updates problem):無法重復(fù)讀取的特例。有兩個并發(fā)事務(wù)同時讀取同一行數(shù)據(jù),然后其中一個對它進行修改提交,而另一個也進行了修改提交。這就會造成第一次寫操作失效。
●?? 虛讀(Phantom Reads):事務(wù)在操作過程中進行兩次查詢,第二次查詢的結(jié)果包含了第一次查詢中未出現(xiàn)的數(shù)據(jù)(這里并不要求兩次查詢的SQL語句相同)。這是因為在兩次查詢過程中有另外一個事務(wù)插入數(shù)據(jù)造成的。
posted on 2009-07-19 21:04
jadmin 閱讀(151)
評論(0) 編輯 收藏