資源描述:
《hibernate事務(wù)處理》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、Hibernate事務(wù)處理開源O/R映射框架數(shù)據(jù)庫(kù)事務(wù)介紹事務(wù)的定義事務(wù)的ACID屬性數(shù)據(jù)庫(kù)事務(wù)聲明通過Hibernate聲明JDBC事務(wù)通過Hibernate聲明JTA事務(wù)并發(fā)控制多個(gè)事務(wù)并發(fā)引起的問題事務(wù)隔離級(jí)別在應(yīng)用程序中解決不可重復(fù)讀問題樂觀鎖(OptimisticLocking)悲觀鎖(PessimisticLocking)Java高端培訓(xùn)2數(shù)據(jù)庫(kù)事務(wù)的定義事務(wù)是指一組相互信賴的操作行為。這些操作要么必須全部成功,要么必須全部失敗,以保證數(shù)據(jù)的一致性和完整性。數(shù)據(jù)庫(kù)事務(wù)是對(duì)現(xiàn)實(shí)生活中事務(wù)的模擬,它由一組在業(yè)務(wù)邏輯上相互信賴的SQL語句組成。示例:銀行轉(zhuǎn)
2、帳操作。Java高端培訓(xùn)3數(shù)據(jù)庫(kù)事務(wù)的ACID屬性ACID:原子性(Atomic):指整個(gè)數(shù)據(jù)庫(kù)事務(wù)是不可分割的工作單元。原子性確保在事務(wù)中的所有操作要么都發(fā)生,要么都不發(fā)生。一致性(Consistency):一旦一個(gè)事務(wù)結(jié)束了(不管成功與否),系統(tǒng)所處的狀態(tài)和它的業(yè)務(wù)規(guī)則是一致的。即數(shù)據(jù)應(yīng)當(dāng)不會(huì)被破壞。隔離性(Isolation):指多個(gè)事務(wù)同時(shí)操作同一數(shù)據(jù)時(shí),每個(gè)事務(wù)都有各自的完整數(shù)據(jù)空間。持久性(Durability):一旦事務(wù)完成,事務(wù)的結(jié)果應(yīng)該持久化。Java高端培訓(xùn)4數(shù)據(jù)庫(kù)事務(wù)聲明Java高端培訓(xùn)5數(shù)據(jù)庫(kù)事務(wù)聲明數(shù)據(jù)庫(kù)系統(tǒng)的客戶程序只要向數(shù)據(jù)庫(kù)系統(tǒng)聲
3、明了一個(gè)事務(wù),數(shù)據(jù)庫(kù)系統(tǒng)就會(huì)自動(dòng)保證事務(wù)的ACID特性。聲明事務(wù)包含:事務(wù)的開始邊界:開始事務(wù)。事務(wù)的正常結(jié)束邊界:提交事務(wù)。事務(wù)的異常結(jié)束邊界:回滾事務(wù)。數(shù)據(jù)庫(kù)系統(tǒng)支持兩種事務(wù)模式:自動(dòng)提交事務(wù)(隱式事務(wù)):每個(gè)SQL語句都是一個(gè)獨(dú)立的事務(wù),當(dāng)數(shù)據(jù)庫(kù)系統(tǒng)執(zhí)行完一條SQL語句后,會(huì)自動(dòng)提交事務(wù)。手工提交事務(wù)(顯式事務(wù)):必須由數(shù)據(jù)庫(kù)系統(tǒng)的客戶程序顯式指定事務(wù)開始邊界和結(jié)束邊界。Java高端培訓(xùn)6回顧通過JDBC聲明事務(wù)Java高端培訓(xùn)7Connectioncon=null;PreparedStatementpstmt=null;try{con=DriverMan
4、ager.getConnection(dbUrl,username,password);//設(shè)置手工提交事務(wù)模式con.setAutoCommit(false);pstmt=……;pstmt.executeUpdate();//提交事務(wù)con.commit();}catch(Exceptione){//事務(wù)回滾con.rollback();…..}finally{…….}通過Hibernate聲明事務(wù)Hibernate本身在設(shè)計(jì)時(shí)并不具備事務(wù)處理功能Hibernate只是將底層的JDBCTransaction或者JTATransaction進(jìn)行了一下封裝,在外面
5、套上Transaction和Session的外殼,其實(shí)底層都是通過委托底層的JDBC或JTA來實(shí)現(xiàn)事務(wù)的調(diào)度功能。Java高端培訓(xùn)8通過Hibernate聲明JDBC事務(wù)如果Hibernat持久層運(yùn)行在一個(gè)非托管環(huán)境中,可以在hibernate配置文件中指定使用的是JDBC事務(wù)。注:如果不進(jìn)行配置,Hibernate也會(huì)默認(rèn)使用JDBC事務(wù)。Java高端培訓(xùn)9org.hibernate.transaction.JDBCTransactionFac
6、toryhibernate.cfg.xmlTransactiontx=null;try{tx=session.beginTransaction();//dosomework...tx.commit();}catch(RuntimeExceptione){if(tx!=null)tx.rollback();throwe;//ordisplayerrormessage}finally{session.close();}注意事項(xiàng)不管事務(wù)成功與否,最后都應(yīng)該調(diào)用Session的close()方法來關(guān)閉Sessio
7、n。即使事務(wù)中只包含只讀操作,也應(yīng)該在事務(wù)執(zhí)行成功后提交事務(wù),并且在事務(wù)執(zhí)行失敗時(shí)撤銷事務(wù)。因?yàn)樵谔峤换虺蜂N事務(wù)時(shí),數(shù)據(jù)庫(kù)會(huì)釋放事務(wù)所占用的資源,有利于提高數(shù)據(jù)庫(kù)的運(yùn)行性能。一個(gè)Session可以包含多個(gè)Transaction實(shí)例,也就是說,一個(gè)Session可以對(duì)應(yīng)多個(gè)事務(wù)。如果在執(zhí)行Session的一個(gè)事務(wù)時(shí)出現(xiàn)了異常,就必須立即關(guān)閉這個(gè)Session,不能再利用這個(gè)Session來執(zhí)行其他的事務(wù)。Java高端培訓(xùn)10通過Hibernate聲明JTA事務(wù)Hibernat持久層運(yùn)行在一個(gè)托管環(huán)境中,可以使用JTAJava高端培訓(xùn)118、ry>