Servlet容器中的事務(wù)
J2EE除了提供了Servlet之外,還提供了大量的其它功能。Servlet開發(fā)者們也許難得使用這些功能,不情愿也沒有時間用一個超出所需的大型J2EE服務(wù)器來替換自己的簡單的Servlet容器。然而,依據(jù)J2EE的模塊化特征,有可能將負責(zé)特定J2EE功能的小組件整合到Servlet容器里,以此來增強WEB應(yīng)用程序。其中之一就是事務(wù)。有關(guān)J2EE事務(wù)的完整描述,您可以參考Onjava上的其他三篇文章,現(xiàn)在只需知道事務(wù)是資源的操作步驟(例如:數(shù)據(jù)庫),它由四個屬性定義,這四個屬性根據(jù)其首字母濃縮為ACID:
原子性:事務(wù)的操作,或者是全部成功(此時提交事務(wù)),或者是全部不成功(此時回滾事務(wù)),謂之為all-or-nothing屬性。一個事務(wù)應(yīng)該被視為單個工作單元,在一個事務(wù)里面絕對不可能同時存在完成了的和沒有完成的操作。
一致性:完成了的事務(wù)將資源從一個有效狀態(tài)轉(zhuǎn)變?yōu)榱硪粋€有效狀態(tài)。一致性的具體例子有:數(shù)據(jù)庫的參照完整性和表中的主鍵唯一性。
獨立性在事務(wù)沒有提交之前,事務(wù)作用的共享資源的改變在事務(wù)之外是不可見的。獨立性確保了不同事務(wù)不會同時訪問正在更新的數(shù)據(jù)。
持久性:由事務(wù)提交的改變會永久存在。
JOTM(Java Open Transaction Manager)是由ObjectWeb協(xié)會開發(fā)的功能完整的且資源開放的獨立的事務(wù)管理器。它提供了JAVA應(yīng)用程序的事務(wù)支持,而且與JTA(JAVA事務(wù)API)兼容。您可以在JOTM home page了解到更多的詳細信息。在TOMCAT或其它Servlet容器整合了JOTM后,JSP和Servlet的開發(fā)者們就可以獲得事務(wù)的優(yōu)勢輕而易舉的創(chuàng)建更多健壯的web應(yīng)用程序。
為了突出事務(wù)是怎樣增強web應(yīng)用程序的,舉一個常用的例子,web瀏覽器與客戶端交互的ATM。
ATM 樣例:
情景
此例比較簡單:一個客戶想從 ATM 提款,輸入了他的客戶名稱,john_doe;想提款數(shù),$50。如果他的銀行帳戶上有足夠的錢并且在 ATM 機上有足夠的現(xiàn)金的話,應(yīng)用程序就能給他相當(dāng)數(shù)目的現(xiàn)金,并從銀行帳戶上提出同樣的數(shù)目。否則,操作中斷,并且除出現(xiàn)錯誤信息之外,其他都不會改變。我們無需擔(dān)心安全問題,只是在猜想用戶是否正確授權(quán)。
這是一個非常簡單的例子,但是如果不使用事務(wù),用別的方法執(zhí)行起來將會很難。客戶端操作將會涉及到兩個不同的資源:ATM 和客戶銀行帳號。它們會自動的在應(yīng)用程序設(shè)計中產(chǎn)生 ACID 問題。例如:如果在 ATM 上操作成功而在銀行帳戶上卻失?。ㄒ苍S是因為交流失?。?,客戶將會取到錢,但是他的帳戶將不會更新。對于銀行來說,這就虧大了。更糟的是,如果銀行帳戶更新了,但是由于一個錯誤阻止 ATM 傳送錢,客戶得不到現(xiàn)金,但是帳戶上卻提掉了這筆款。
為了防止出現(xiàn)上述事故,在你的應(yīng)用程序里,你能夠 1) 聯(lián)系兩個資源,并告知兩者客戶執(zhí)行的所有當(dāng)前操作,2)詢問兩者是否能執(zhí)行操作,3)如果兩者都同意,則請求操作。即使這樣,此方法也不能謂之足夠健壯,因為,如果客戶帳戶上的錢在第二步和第三步的時候被另外一操作提走,提款可能會失敗,例如,客戶帳戶不能出現(xiàn)逆差。
事務(wù)能使應(yīng)用程序更簡單更健壯的之處就是:在同一事務(wù)的兩個資源上執(zhí)行所有的操作的時候,它將會解決 ACID 的問題(尤其是原子性)。
【編輯推薦】