資源描述:
《hibernate事務(wù)與并發(fā)》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、HibernateORM最佳實踐第4章Hibernate事務(wù)與并發(fā)回顧了解Hibernate持久對象的生命周期管理理解Session的緩存機制掌握Hibernate中操作對象的幾種方法以及最佳實現(xiàn)掌握Hibernate的查詢方式及實現(xiàn)2目標(biāo)了解Hibernate事務(wù)理解數(shù)據(jù)庫并發(fā)操作事務(wù)隔離級別掌握Hibernate的并發(fā)控制3事務(wù)概念所謂事務(wù),就是為了完成一個工作單元執(zhí)行的一系列操作,這些操作是相互依賴的,要么全部執(zhí)行成功,要么全部失敗事物初始狀態(tài)A:從帳戶A取100元B:給帳戶B加100元某個操作失敗,事務(wù)回滾到初始狀態(tài)(事務(wù)開始)事物初始狀態(tài)
2、(事務(wù)成功)事務(wù)具備4個特性:ACID4Hibernate事務(wù)Hibenate本身沒有事務(wù)管理能力,而是依賴于底層的JDBCAPI和JTAAPI,并將其進(jìn)行封裝.通過調(diào)用session.beginTransaction()返回一個Transaction對象,開始一個事務(wù).該對象提供commit()和rollback()來提交和回滾事務(wù).5Hibernate事務(wù)類型<>Transactionbegin()commit()Rollback()CMTTransactionbegin()commit()Rollback()begin(
3、)commit()Rollback()begin()commit()Rollback()JTATransactionJDBCTransactionCMTTransactionFactoryJTATransactionFactoryJDBCTransactionFactory<>TransactionFactorycreateTransaction():TransactioncreateTransaction():TransactioncreateTransaction():TransactioncreateTransactio
4、n():Transaction在Hibernate可以配置三種類型事務(wù)運行在不同的環(huán)境中,如圖:不同類實現(xiàn)Transaction接口在hibernate配置文件,利用屬性hibernate.transaction.factory_class來明確一個事務(wù)工廠產(chǎn)生某一類事務(wù)的實例.Hibernate默認(rèn)事務(wù)類型*6同步Session和數(shù)據(jù)庫刷新模式可以使用Session.setFlushMode(FlushMode)設(shè)置FlushMode.MANUAL手動刷新模式FlushMode.COMMIT在事務(wù)提交前刷新SessionFlushMode.AUT
5、O(默認(rèn))自動更新FlushMode.ALWAYS每執(zhí)行一次操作刷新一次7事務(wù)并發(fā)問題更新丟失(一個事務(wù)的回滾影響到另一事務(wù)的更新結(jié)果)臟讀(事務(wù)在執(zhí)行過程中訪問到了其它事務(wù)未提交的數(shù)據(jù))不可重復(fù)讀(事務(wù)在執(zhí)行過程中再次讀取同一數(shù)據(jù)時,發(fā)現(xiàn)其他事務(wù)對此數(shù)據(jù)進(jìn)行了更新)原因是因為另一個事務(wù)執(zhí)行的update操作幻想讀(事務(wù)在執(zhí)行過程中再次執(zhí)行同一查詢時,發(fā)現(xiàn)其它事務(wù)的更新)原因是另一個事務(wù)執(zhí)行的insert和delete操作8示例-1T2T1T3T4T5T6T7T8取款事務(wù)存款事務(wù)事務(wù)開始查詢余額100事務(wù)開始查詢余額100-10(90)+20(12
6、0)提交事務(wù)事務(wù)回滾(100)導(dǎo)致更新丟失T2T1T3T4T5T6T7T8事務(wù)開始查詢余額100事務(wù)開始-10(90)查詢余額90+20(110)提交事務(wù)事務(wù)回滾(100)DirtyRead未提交數(shù)據(jù)9示例-2T2T1T3T4T5T6T7T8存款事務(wù)1存款事務(wù)2事務(wù)開始查詢余額100事務(wù)開始查詢余額100+20(120)+20(120)提交事務(wù)提交事務(wù)兩個事務(wù)都不知道對方存在需要加鎖機制T2T1T3T4T5T6T7T8注冊事務(wù)統(tǒng)計事務(wù)事務(wù)開始事務(wù)開始查詢?nèi)藬?shù)50+1提交事務(wù)查詢?nèi)藬?shù)51事務(wù)執(zhí)行過程中發(fā)生數(shù)據(jù)改變10事務(wù)隔離級別讀未提交級別-1讀已提
7、交級別-2可重復(fù)讀級別-4串行化事務(wù)-8在配置文件中,設(shè)置屬性hibernate.connection.isolation的隔離級別,全局選項,影響所有的數(shù)據(jù)庫連接和事務(wù).一般情況下,可以先為整個應(yīng)用程序設(shè)置合理的隔離級別,再在必要的地方使用鎖結(jié)合管理;數(shù)據(jù)庫鎖的級別越高,并發(fā)性越低,一般設(shè)置讀已提交級別.不能解決臟數(shù)據(jù)、不可重復(fù)讀、幻象讀不能解決不可重復(fù)讀、幻象讀不能解決幻象讀解決上述問題11Hibernate并發(fā)控制在應(yīng)用程序中采用悲觀鎖和樂觀鎖解決①悲觀鎖應(yīng)用程序為數(shù)據(jù)資源顯示加鎖(一般使用數(shù)據(jù)庫提供功能)當(dāng)數(shù)據(jù)資源被鎖定時,其他并發(fā)的事務(wù)就
8、不能再同時訪問此數(shù)據(jù)資源,直致當(dāng)前事務(wù)使用數(shù)據(jù)資源釋放鎖,其它事務(wù)才能繼續(xù)訪問(性能影響較大)②樂觀鎖假定在存取數(shù)據(jù)時,不