資源描述:
《Hibernate事務(wù)緩存》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、第十三章第十三章HibernateHibernate事務(wù)、并發(fā)及緩存管理事務(wù)、并發(fā)及緩存管理課程目標課程目標?HibernateHibernate提交事務(wù)與撤消事務(wù)提交事務(wù)與撤消事務(wù)?HibernateHibernate多事務(wù)引發(fā)的并發(fā)問題多事務(wù)引發(fā)的并發(fā)問題?采用悲觀鎖與樂觀鎖解決并發(fā)問題采用悲觀鎖與樂觀鎖解決并發(fā)問題?HibernateHibernate緩存的管理緩存的管理體驗項目體驗項目————<<模擬銀行轉(zhuǎn)賬程序模擬銀行轉(zhuǎn)賬程序>>程序?qū)崿F(xiàn)的功能:該程序以銀行轉(zhuǎn)賬流程作為參考,實現(xiàn)了模擬銀行轉(zhuǎn)賬的功能。程序運行的過程如下所示:(1)創(chuàng)建
2、一個數(shù)據(jù)庫表,用來存儲賬戶余額。在圖13-1所示的表中定義了兩個字段,id表示賬戶ID,balance表示賬戶余額。(2)開始測試程序。在轉(zhuǎn)賬頁面,將顯示出用戶1的賬戶余額,以及可選擇轉(zhuǎn)賬金額與被轉(zhuǎn)入的賬戶ID。我們在此選擇轉(zhuǎn)賬金額為150元,轉(zhuǎn)入的賬戶ID為2。如圖13-2所示:圖13-2轉(zhuǎn)賬頁面(3)確認轉(zhuǎn)賬金額與被轉(zhuǎn)入的賬戶ID后,即可點擊“確定”按鈕進行轉(zhuǎn)賬操作。此時程序?qū)㈨樌貓?zhí)行轉(zhuǎn)賬操作,并且將進入轉(zhuǎn)賬成功頁面。在該頁面將會顯示所轉(zhuǎn)賬的各項數(shù)據(jù)以及轉(zhuǎn)賬后的賬戶余額。如圖13-3所示:圖13-3轉(zhuǎn)賬成功(4)轉(zhuǎn)賬成功后,還需要去數(shù)據(jù)庫
3、中查看轉(zhuǎn)賬是否順利完成。因為在現(xiàn)實的銀行轉(zhuǎn)賬后,是不可能直接顯示對方的賬戶余額的。(5)由于我們實現(xiàn)的只是模擬轉(zhuǎn)賬,所以還有許多需要檢驗的地方并沒有實現(xiàn)。但是,至少需要保證轉(zhuǎn)賬金額是不少于賬戶余額或者轉(zhuǎn)賬金額為負數(shù)。當你輸入的轉(zhuǎn)賬金額為該類情況時,程序?qū)o法進行轉(zhuǎn)賬操作,并提示轉(zhuǎn)賬失敗,如圖13-5所示:圖13-5轉(zhuǎn)賬失敗SessionSession與事務(wù)范圍與事務(wù)范圍SessionFactory是一個重量級的對象,創(chuàng)建一個SessionFactory對象需要消耗很多的資源。但它卻是線程安全的,在應用程序中被所有的線程所共享。通常在應用中,它只
4、能被創(chuàng)建一次,即在應用程序啟動時,由Configuration的實例來創(chuàng)建。創(chuàng)建一個Session所消耗的資源是比較小的,但它卻是非線程安全的,對于單個請求,單個會話,單個工作單元而言,它只被使用一次就應該被丟棄。只有在需要的時候,一個Session對象才會獲取一個JDBC的Connection對象。因此在不使用的時候,Session是不會消耗任何資源的。在創(chuàng)建Hibernate會話時,應注意以下幾個問題:?對于一個數(shù)據(jù)庫鏈接,不要創(chuàng)建一個以上的Session或Transaction。?對于一個數(shù)據(jù)庫鏈接、一個事務(wù)使用多個Session時,需要
5、格外地小心,Session對象會記錄下調(diào)入數(shù)據(jù)更新的情況,所以另一個Session對象可能會遇到過時的數(shù)據(jù)。?Session不是線程安全的,絕不要在兩個并發(fā)的線程中訪問同一個Session。一個Session一般只對應一批需要一次性完成的操作單元。事務(wù)概念與聲明事務(wù)邊界事務(wù)概念與聲明事務(wù)邊界數(shù)據(jù)庫事務(wù)的概念事務(wù)是指一組相互依賴的操作行為,例如現(xiàn)在比較流行的網(wǎng)上購物或通過ATM機進行銀行轉(zhuǎn)賬等。事務(wù)的成功取決于這一組相互依賴的操作行為都執(zhí)行成功,如果這一組行為中某一個操作行為失敗了,就意味著整個事務(wù)失敗。數(shù)據(jù)庫事務(wù)必須具備ACID特征:(1)A就
6、是Atomic(原子性):是指整個數(shù)據(jù)庫事務(wù)是一個不可分割的工作單元,只有事務(wù)中每個操作都執(zhí)行成功后,事務(wù)才算成功。(2)C就是Consistency(一致性):是指數(shù)據(jù)庫事務(wù)不能破壞數(shù)據(jù)的完整性和業(yè)務(wù)邏輯的一致性。(3)I就是Isoloation(隔離性):在并發(fā)環(huán)境中,當不同的事務(wù)操作相同的數(shù)據(jù)時,都應該有自己的一個完整的數(shù)據(jù)空間。(4)D就是Durability(持久性):指的是事務(wù)只要操作成功,它對數(shù)據(jù)庫的修改就永久保存下來。通過JDBCAPI聲明事務(wù)邊界在JDBCAPI中,java.sql.Connection類代表了一個數(shù)據(jù)庫連接,
7、它提供了一些用于控制事務(wù)的方法,其具體函數(shù)功能如下:?setAutoCommit(booleanautoCommit):設(shè)置是否自動提交事務(wù)。?commit():提交事務(wù)。?rollback():撤消事務(wù)。在默認情況下,新創(chuàng)建的Connection實例會采用自動提交事務(wù)模式。我們也可以通過調(diào)用它的setAutoCommit(booleanautoCommit)方法來設(shè)置手工提交事務(wù)的模式,然后把多條更新數(shù)據(jù)的SQL語句作為一個事務(wù)。當所有操作完成后再調(diào)用commit()提交事務(wù)。如果有某條SQL語句執(zhí)行失敗,系統(tǒng)就會拋出SQLException
8、異常,我們可以在捕獲異常的代碼中調(diào)用rollback()方法來撤銷事務(wù),通過HibernateAPI聲明事務(wù)邊界Hibernate對JDBC作了輕量級