Hibernate_事務處理_第1頁
Hibernate_事務處理_第2頁
Hibernate_事務處理_第3頁
Hibernate_事務處理_第4頁
Hibernate_事務處理_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、Hibernate事務處理開源O/R映射框架v數(shù)據(jù)庫事務介紹數(shù)據(jù)庫事務介紹事務的定義事務的ACID屬性v數(shù)據(jù)庫事務聲明數(shù)據(jù)庫事務聲明通過Hibernate聲明JDBC事務通過Hibernate聲明JTA事務v并發(fā)控制并發(fā)控制多個事務并發(fā)引起的問題事務隔離級別在應用程序中解決不可重復讀問題樂觀鎖(Optimistic Locking)悲觀鎖(Pessimistic Locking)Java高端培訓2數(shù)據(jù)庫事務的定義事務是指一組相互信賴的操作行為。這些操作要么必須全部成功,要么必須全部失敗,以保證數(shù)據(jù)的一致性和完整性。數(shù)據(jù)庫事務是對現(xiàn)實生活中事務的模擬,它由一組在業(yè)務邏輯上相互信賴的SQL語句組成

2、。示例:銀行轉帳操作。Java高端培訓3數(shù)據(jù)庫事務的ACID屬性ACID:原子性(Atomic):指整個數(shù)據(jù)庫事務是不可分割的工作單元。原子性確保在事務中的所有操作要么都發(fā)生,要么都不發(fā)生。一致性(Consistency):一旦一個事務結束了(不管成功與否),系統(tǒng)所處的狀態(tài)和它的業(yè)務規(guī)則是一致的。即數(shù)據(jù)應當不會被破壞。隔離性(Isolation):指多個事務同時操作同一數(shù)據(jù)時,每個事務都有各自的完整數(shù)據(jù)空間。持久性(Durability):一旦事務完成,事務的結果應該持久化。Java高端培訓4v數(shù)據(jù)庫事務聲明數(shù)據(jù)庫事務聲明Java高端培訓5數(shù)據(jù)庫事務聲明數(shù)據(jù)庫系統(tǒng)的客戶程序只要向數(shù)據(jù)庫系統(tǒng)聲明

3、了一個事務,數(shù)據(jù)庫系統(tǒng)就會自動保證事務的ACID特性。聲明事務包含:事務的開始邊界:開始事務。事務的正常結束邊界:提交事務。事務的異常結束邊界:回滾事務。數(shù)據(jù)庫系統(tǒng)支持兩種事務模式:自動提交事務(隱式事務): 每個SQL語句都是一個獨立的事務,當數(shù)據(jù)庫系統(tǒng)執(zhí)行完一條SQL語句后,會自動提交事務。手工提交事務(顯式事務):必須由數(shù)據(jù)庫系統(tǒng)的客戶程序顯式指定事務開始邊界和結束邊界。Java高端培訓6回顧通過JDBC聲明事務Java高端培訓7Connection con = null;PreparedStatement pstmt = null;try con = DriverManager.get

4、Connection(dbUrl, username, password); /設置手工提交事務模式 con.setAutoCommit(false); pstmt = ; pstmt.executeUpdate(); /提交事務 mit();catch(Exception e) /事務回滾 con.rollback(); . finally .通過Hibernate聲明事務Hibernate本身在設計時并不具備事務處理功能Hibernate只是將底層的JDBCTransaction或者JTATransaction進行了一下封裝,在外面套上Transaction和Session的外殼,其實底層

5、都是通過委托底層的JDBC或JTA來實現(xiàn)事務的調度功能。Java高端培訓8通過Hibernate聲明JDBC事務如果Hibernat持久層運行在一個非托管環(huán)境中,可以在hibernate配置文件中指定使用的是JDBC事務。注:如果不進行配置,Hibernate也會默認使用JDBC事務。Java高端培訓9 org.hibernate.transaction.JDBCTransactionFactory hibernate.cfg.xmlTransaction tx = null;try tx = session.beginTransaction(); / do some work. mit();

6、catch (RuntimeException e) if (tx != null) tx.rollback(); throw e; / or display error messagefinally session.close(); 注意事項不管事務成功與否,最后都應該調用Session的close()方法來關閉Session。即使事務中只包含只讀操作,也應該在事務執(zhí)行成功后提交事務,并且在事務執(zhí)行失敗時撤銷事務。因為在提交或撤銷事務時,數(shù)據(jù)庫會釋放事務所占用的資源,有利于提高數(shù)據(jù)庫的運行性能。一個Session可以包含多個Transaction實例,也就是說,一個Session可以對應多個

7、事務。如果在執(zhí)行Session的一個事務時出現(xiàn)了異常,就必須立即關閉這個Session,不能再利用這個Session來執(zhí)行其他的事務。Java高端培訓10通過Hibernate聲明JTA事務Hibernat持久層運行在一個托管環(huán)境中,可以使用JTAJava高端培訓11 org.hibernate.transaction.JTATransactionFactory / BMT(bean管理事務) UserTransaction tx = null;try tx = (UserTransaction)new InitialContext().lookup(java:comp/UserTransac

8、tion); tx.begin(); / Do some work on Session bound to transaction factory.getCurrentSession().persist(.); mit(); catch (RuntimeException e) tx.rollback(); throw e; / or display error messagehibernate.cfg.xml注:在CMT(容器管理事務)方式下,事務聲明是在session bean的部署描述符中,而不需要編程。v并發(fā)控制并發(fā)控制多個事務并發(fā)引起的問題事務隔離級別在應用程序中解決不可重復讀問題樂

9、觀鎖(Optimistic Locking)悲觀鎖(Pessimistic Locking)Java高端培訓12多個事務并發(fā)引起的問題多個事務同時訪問數(shù)據(jù)庫中相同的數(shù)據(jù)時,如果沒有采取必要的隔離機制,就可能會發(fā)生如下并發(fā)問題:第一類丟失更新:撤消一個事務時,把其它事務已提交的更新數(shù)據(jù)也撤消了。臟讀:一個事務讀到另一個事務未提交的更新數(shù)據(jù)。不可重復讀:一個事務讀到另一個事務已經(jīng)提交的更改數(shù)據(jù)。第二類丟失更新:一個事務覆蓋另一個事務已經(jīng)提交的更新數(shù)據(jù)?;米x:一個事務讀到另一個事務已提交的新增或已刪除數(shù)據(jù)。Java高端培訓13QQ群群 45390709取款事務和支票轉賬事務取款事務包含以下步驟:(1

10、)某銀行客戶在銀行前臺請求取款100元,出納員先查詢賬戶信息,得知存款余額為1000元。(2)出納員判斷出存款額超過了取款額,就支付給客戶100元,并將賬戶上的存款余額改為900元。支票轉賬事務包含以下步驟:(1)某出納員處理一轉帳支票,該支票向一帳戶匯入100元。出納員先查詢賬戶信息,得知存款余額為900元。(2)出納員將存款余額改為1000元。10009001000支票轉入100取出1001.第一類丟失更新時間時間取款事務取款事務支票事務支票事務T1開始事務T2開始事務T3查詢帳戶余額1000元T4查詢帳戶余額1000元T5存入100元,把存款余額改成1100元T6存入100元,把存款余額

11、改成1100元T7回滾事務T8回滾事務2.臟讀取(Dirty Reads)時間時間取款事務取款事務支票事務支票事務T1開始事務T2開始事務T3查詢帳戶余額1000元T4取出100元,把存款余額改成900元T5查詢帳戶余額900(臟讀)T6回滾事務,余額變?yōu)?000元T7匯入100元,把余額更改為1000元T8提交事務3.不可重復讀時間時間取款事務取款事務支票事務支票事務T1開始事務T2開始事務T3查詢帳戶余額1000元T4查詢帳戶余額1000元T5存入100元,把存款余額改成1100元T6存入100元,把存款余額改成1100元T7提交事務T8提交事務QQ群群 453907094 并發(fā)運行的兩個

12、事務導致第二類丟失更新 取款事務在T5時刻根據(jù)在T3時刻的查詢結果,把存款余額改為1000-100元,在T6時刻提交事務。支票轉賬事務在T7時刻根據(jù)在T4時刻的查詢結果,把存款余額改為1000+100元。由于支票轉賬事務覆蓋了取款事務對存款余額所做的更新,導致銀行最后損失100元。5 虛讀(幻讀)時間時間注冊事務注冊事務統(tǒng)計事務統(tǒng)計事務T1開始事務T2開始事務T3查詢注冊人數(shù)為100人T4新注冊一個用戶T5提交事務T6再次查詢,注冊人數(shù)為101人T7弄不清楚到底是100人還是101人數(shù)據(jù)庫事務隔離級別為了解決多個事務并發(fā)會引發(fā)的問題,讓用戶根據(jù)需要在事務的隔離性和并發(fā)性之間做合理的權衡,數(shù)據(jù)庫

13、系統(tǒng)提供了四種事務隔離級別供用戶選擇:Read Uncommitted(讀未提交數(shù)據(jù)):它可以防止第一類丟失更新問題,但沒有解決臟讀以上的并發(fā)問題。它的事務隔離性最低。Read Committed(讀已提交數(shù)據(jù)):它可以防止臟讀以下的并發(fā)問題,但沒有解決不可重復讀以上的并發(fā)問題。Repeatable Read(可重復讀):它可以防止不可重復讀(包括第二類丟失更新)以下的并發(fā)問題,但沒有解決幻讀問題。Serializable(串行化):提供最嚴格的事務隔離性。它把事務隔離成連續(xù)的一個接一個地執(zhí)行,而不是并發(fā)執(zhí)行。在這種隔離級別下,不會出現(xiàn)任何的并發(fā)問題。Java高端培訓20各種隔離級別所能避免的

14、并發(fā)問題隔離級別越高,越能保證數(shù)據(jù)的完整性和一致性,但對并發(fā)性能的影響也越大。對于多數(shù)應用,可能優(yōu)先考慮把數(shù)據(jù)庫系統(tǒng)的隔離級別設為Read Committed,它能夠避免臟讀,而且具有較好的并發(fā)性能。Java高端培訓21隔離級別隔離級別是否會出現(xiàn)第是否會出現(xiàn)第一類丟失更新一類丟失更新是否會出是否會出現(xiàn)臟讀現(xiàn)臟讀是否會出現(xiàn)是否會出現(xiàn)不可重復讀不可重復讀是否會出現(xiàn)第是否會出現(xiàn)第二類丟失更新二類丟失更新是否會出是否會出現(xiàn)幻讀現(xiàn)幻讀Serializable否否否否否Repeatable Read否否否否是Read Committed否否是是是Read Uncommitted否是是是是在應用程序中設置隔

15、離級別每個數(shù)據(jù)庫連接都有一個全局變量tx_isolation表示當前的事務隔離級別。JDBC使用數(shù)據(jù)庫系統(tǒng)默認的隔離級別。在非托管環(huán)境下:Hibernate配置文件中可以顯示地設置隔離級別。每一種隔離級別對應著一個正整數(shù):Read Uncommitted: 1Read Committed: 2Repeatable Read: 4Serializable: 8在hibernate配置文件中設置隔離級別方式:Java高端培訓22 2托管環(huán)境的隔離級別設置在受管理環(huán)境中,如果Hibernate使用的數(shù)據(jù)庫連接來自于應用服務器提供的數(shù)據(jù)源,Hibernate不會改變這些連接的事務隔離級別。這種情況下,

16、應該通過修改應用服務器的數(shù)據(jù)源配置來修改隔離級別。Java高端培訓23解決不可重復讀問題當數(shù)據(jù)庫系統(tǒng)采用Read Committed隔離級別時,會導致不可重復讀和第二類丟失更新的并發(fā)問題。在可能出現(xiàn)這種問題的場合,可以在應用程序中采用樂觀鎖或悲觀鎖來避免這類問題。Java高端培訓24樂觀鎖(Optimistic Locking)樂觀鎖假定當前事務操縱數(shù)據(jù)資源時,不會有其他事務同時訪問該數(shù)據(jù)資源,因此不作數(shù)據(jù)庫層次上的鎖定。為了維護正確的數(shù)據(jù),樂觀鎖使用應用程序上的版本控制(由程序邏輯來實現(xiàn)的)來避免可能出現(xiàn)的并發(fā)問題。唯一能夠同時保持高并發(fā)和高可伸縮性的方法就是使用帶版本化的樂觀并發(fā)控制。版本

17、檢查使用版本號()或者時間戳()來檢測更新沖突并防止更新丟失。Java高端培訓25使用進行版本控制原理:在數(shù)據(jù)庫表中加入一個version(版本)字段,在讀取數(shù)據(jù)時連同版本號一起讀取。在更新數(shù)據(jù)時先比較新數(shù)據(jù)的版本號與數(shù)據(jù)庫表中的版本號:如果等于數(shù)據(jù)庫表中的版本號則予以更新,并遞增版本號。如果小于數(shù)據(jù)庫表中的版本號就拋出異常。Hibernate在其數(shù)據(jù)庫訪問引擎中內(nèi)置了樂觀鎖定實現(xiàn),默認也是選擇version方式作為Hibernate樂觀鎖定實現(xiàn)機制。步驟:在持久化類中定義一個代表版本號的屬性。類型:long, integer, short在對象關系映射文件中用標記來建立持久化類的versio

18、n屬性與表中version字段的映射,一定要定義在一定要定義在元素后面元素后面。完成以上兩個步驟后,在配置文件及程序中就無須作其它設置,按往常一樣寫操作代碼就可以了。Java高端培訓26示例Java高端培訓27public class Product implements java.io.Serializable private Long id ; private int version; /版本號 private String name; /產(chǎn)品名 private String description; /描述-簡介 private Double unitCost; /單價 private Date pubTime; /生產(chǎn)日期 . Product.javaProduct.hbm.xml注意事項使用時間戳()也可以完成樂觀鎖定機制,但不是特別安全的實現(xiàn)。用法跟版本檢查相似。由于樂觀鎖定是使用系統(tǒng)中的程序來控制,而不是使用數(shù)據(jù)庫中的鎖定機制,因而如果有人故意自行更新版本

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論