版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Hibernate事務(wù)處理開源O/R映射框架v數(shù)據(jù)庫(kù)事務(wù)介紹數(shù)據(jù)庫(kù)事務(wù)介紹事務(wù)的定義事務(wù)的ACID屬性v數(shù)據(jù)庫(kù)事務(wù)聲明數(shù)據(jù)庫(kù)事務(wù)聲明通過Hibernate聲明JDBC事務(wù)通過Hibernate聲明JTA事務(wù)v并發(fā)控制并發(fā)控制多個(gè)事務(wù)并發(fā)引起的問題事務(wù)隔離級(jí)別在應(yīng)用程序中解決不可重復(fù)讀問題樂觀鎖(Optimistic Locking)悲觀鎖(Pessimistic Locking)Java高端培訓(xùn)2數(shù)據(jù)庫(kù)事務(wù)的定義事務(wù)是指一組相互信賴的操作行為。這些操作要么必須全部成功,要么必須全部失敗,以保證數(shù)據(jù)的一致性和完整性。數(shù)據(jù)庫(kù)事務(wù)是對(duì)現(xiàn)實(shí)生活中事務(wù)的模擬,它由一組在業(yè)務(wù)邏輯上相互信賴的SQL語(yǔ)句組成
2、。示例:銀行轉(zhuǎn)帳操作。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)4v數(shù)據(jù)庫(kù)事務(wù)聲明數(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語(yǔ)句都是一個(gè)獨(dú)立的事務(wù),當(dāng)數(shù)據(jù)庫(kù)系統(tǒng)執(zhí)行完一條SQL語(yǔ)句后,會(huì)自動(dòng)提交事務(wù)。手工提交事務(wù)(顯式事務(wù)):必須由數(shù)據(jù)庫(kù)系統(tǒng)的客戶程序顯式指定事務(wù)開始邊界和結(jié)束邊界。Java高端培訓(xùn)6回顧通過JDBC聲明事務(wù)Java高端培訓(xùn)7Connection con = null;PreparedStatement pstmt = null;try con = DriverManager.get
4、Connection(dbUrl, username, password); /設(shè)置手工提交事務(wù)模式 con.setAutoCommit(false); pstmt = ; pstmt.executeUpdate(); /提交事務(wù) mit();catch(Exception e) /事務(wù)回滾 con.rollback(); . finally .通過Hibernate聲明事務(wù)Hibernate本身在設(shè)計(jì)時(shí)并不具備事務(wù)處理功能Hibernate只是將底層的JDBCTransaction或者JTATransaction進(jìn)行了一下封裝,在外面套上Transaction和Session的外殼,其實(shí)底層
5、都是通過委托底層的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)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(); 注意事項(xiàng)不管事務(wù)成功與否,最后都應(yīng)該調(diào)用Session的close()方法來關(guān)閉Session。即使事務(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è)
7、事務(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)11 org.hibernate.transaction.JTATransactionFactory / BMT(bean管理事務(wù)) 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(容器管理事務(wù))方式下,事務(wù)聲明是在session bean的部署描述符中,而不需要編程。v并發(fā)控制并發(fā)控制多個(gè)事務(wù)并發(fā)引起的問題事務(wù)隔離級(jí)別在應(yīng)用程序中解決不可重復(fù)讀問題樂
9、觀鎖(Optimistic Locking)悲觀鎖(Pessimistic Locking)Java高端培訓(xùn)12多個(gè)事務(wù)并發(fā)引起的問題多個(gè)事務(wù)同時(shí)訪問數(shù)據(jù)庫(kù)中相同的數(shù)據(jù)時(shí),如果沒有采取必要的隔離機(jī)制,就可能會(huì)發(fā)生如下并發(fā)問題:第一類丟失更新:撤消一個(gè)事務(wù)時(shí),把其它事務(wù)已提交的更新數(shù)據(jù)也撤消了。臟讀:一個(gè)事務(wù)讀到另一個(gè)事務(wù)未提交的更新數(shù)據(jù)。不可重復(fù)讀:一個(gè)事務(wù)讀到另一個(gè)事務(wù)已經(jīng)提交的更改數(shù)據(jù)。第二類丟失更新:一個(gè)事務(wù)覆蓋另一個(gè)事務(wù)已經(jīng)提交的更新數(shù)據(jù)?;米x:一個(gè)事務(wù)讀到另一個(gè)事務(wù)已提交的新增或已刪除數(shù)據(jù)。Java高端培訓(xùn)13QQ群群 45390709取款事務(wù)和支票轉(zhuǎn)賬事務(wù)取款事務(wù)包含以下步驟:(1
10、)某銀行客戶在銀行前臺(tái)請(qǐng)求取款100元,出納員先查詢賬戶信息,得知存款余額為1000元。(2)出納員判斷出存款額超過了取款額,就支付給客戶100元,并將賬戶上的存款余額改為900元。支票轉(zhuǎn)賬事務(wù)包含以下步驟:(1)某出納員處理一轉(zhuǎn)帳支票,該支票向一帳戶匯入100元。出納員先查詢賬戶信息,得知存款余額為900元。(2)出納員將存款余額改為1000元。10009001000支票轉(zhuǎn)入100取出1001.第一類丟失更新時(shí)間時(shí)間取款事務(wù)取款事務(wù)支票事務(wù)支票事務(wù)T1開始事務(wù)T2開始事務(wù)T3查詢帳戶余額1000元T4查詢帳戶余額1000元T5存入100元,把存款余額改成1100元T6存入100元,把存款余額
11、改成1100元T7回滾事務(wù)T8回滾事務(wù)2.臟讀取(Dirty Reads)時(shí)間時(shí)間取款事務(wù)取款事務(wù)支票事務(wù)支票事務(wù)T1開始事務(wù)T2開始事務(wù)T3查詢帳戶余額1000元T4取出100元,把存款余額改成900元T5查詢帳戶余額900(臟讀)T6回滾事務(wù),余額變?yōu)?000元T7匯入100元,把余額更改為1000元T8提交事務(wù)3.不可重復(fù)讀時(shí)間時(shí)間取款事務(wù)取款事務(wù)支票事務(wù)支票事務(wù)T1開始事務(wù)T2開始事務(wù)T3查詢帳戶余額1000元T4查詢帳戶余額1000元T5存入100元,把存款余額改成1100元T6存入100元,把存款余額改成1100元T7提交事務(wù)T8提交事務(wù)QQ群群 453907094 并發(fā)運(yùn)行的兩個(gè)
12、事務(wù)導(dǎo)致第二類丟失更新 取款事務(wù)在T5時(shí)刻根據(jù)在T3時(shí)刻的查詢結(jié)果,把存款余額改為1000-100元,在T6時(shí)刻提交事務(wù)。支票轉(zhuǎn)賬事務(wù)在T7時(shí)刻根據(jù)在T4時(shí)刻的查詢結(jié)果,把存款余額改為1000+100元。由于支票轉(zhuǎn)賬事務(wù)覆蓋了取款事務(wù)對(duì)存款余額所做的更新,導(dǎo)致銀行最后損失100元。5 虛讀(幻讀)時(shí)間時(shí)間注冊(cè)事務(wù)注冊(cè)事務(wù)統(tǒng)計(jì)事務(wù)統(tǒng)計(jì)事務(wù)T1開始事務(wù)T2開始事務(wù)T3查詢注冊(cè)人數(shù)為100人T4新注冊(cè)一個(gè)用戶T5提交事務(wù)T6再次查詢,注冊(cè)人數(shù)為101人T7弄不清楚到底是100人還是101人數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別為了解決多個(gè)事務(wù)并發(fā)會(huì)引發(fā)的問題,讓用戶根據(jù)需要在事務(wù)的隔離性和并發(fā)性之間做合理的權(quán)衡,數(shù)據(jù)庫(kù)
13、系統(tǒng)提供了四種事務(wù)隔離級(jí)別供用戶選擇:Read Uncommitted(讀未提交數(shù)據(jù)):它可以防止第一類丟失更新問題,但沒有解決臟讀以上的并發(fā)問題。它的事務(wù)隔離性最低。Read Committed(讀已提交數(shù)據(jù)):它可以防止臟讀以下的并發(fā)問題,但沒有解決不可重復(fù)讀以上的并發(fā)問題。Repeatable Read(可重復(fù)讀):它可以防止不可重復(fù)讀(包括第二類丟失更新)以下的并發(fā)問題,但沒有解決幻讀問題。Serializable(串行化):提供最嚴(yán)格的事務(wù)隔離性。它把事務(wù)隔離成連續(xù)的一個(gè)接一個(gè)地執(zhí)行,而不是并發(fā)執(zhí)行。在這種隔離級(jí)別下,不會(huì)出現(xiàn)任何的并發(fā)問題。Java高端培訓(xùn)20各種隔離級(jí)別所能避免的
14、并發(fā)問題隔離級(jí)別越高,越能保證數(shù)據(jù)的完整性和一致性,但對(duì)并發(fā)性能的影響也越大。對(duì)于多數(shù)應(yīng)用,可能優(yōu)先考慮把數(shù)據(jù)庫(kù)系統(tǒng)的隔離級(jí)別設(shè)為Read Committed,它能夠避免臟讀,而且具有較好的并發(fā)性能。Java高端培訓(xùn)21隔離級(jí)別隔離級(jí)別是否會(huì)出現(xiàn)第是否會(huì)出現(xiàn)第一類丟失更新一類丟失更新是否會(huì)出是否會(huì)出現(xiàn)臟讀現(xiàn)臟讀是否會(huì)出現(xiàn)是否會(huì)出現(xiàn)不可重復(fù)讀不可重復(fù)讀是否會(huì)出現(xiàn)第是否會(huì)出現(xiàn)第二類丟失更新二類丟失更新是否會(huì)出是否會(huì)出現(xiàn)幻讀現(xiàn)幻讀Serializable否否否否否Repeatable Read否否否否是Read Committed否否是是是Read Uncommitted否是是是是在應(yīng)用程序中設(shè)置隔
15、離級(jí)別每個(gè)數(shù)據(jù)庫(kù)連接都有一個(gè)全局變量tx_isolation表示當(dāng)前的事務(wù)隔離級(jí)別。JDBC使用數(shù)據(jù)庫(kù)系統(tǒng)默認(rèn)的隔離級(jí)別。在非托管環(huán)境下:Hibernate配置文件中可以顯示地設(shè)置隔離級(jí)別。每一種隔離級(jí)別對(duì)應(yīng)著一個(gè)正整數(shù):Read Uncommitted: 1Read Committed: 2Repeatable Read: 4Serializable: 8在hibernate配置文件中設(shè)置隔離級(jí)別方式:Java高端培訓(xùn)22 2托管環(huán)境的隔離級(jí)別設(shè)置在受管理環(huán)境中,如果Hibernate使用的數(shù)據(jù)庫(kù)連接來自于應(yīng)用服務(wù)器提供的數(shù)據(jù)源,Hibernate不會(huì)改變這些連接的事務(wù)隔離級(jí)別。這種情況下,
16、應(yīng)該通過修改應(yīng)用服務(wù)器的數(shù)據(jù)源配置來修改隔離級(jí)別。Java高端培訓(xùn)23解決不可重復(fù)讀問題當(dāng)數(shù)據(jù)庫(kù)系統(tǒng)采用Read Committed隔離級(jí)別時(shí),會(huì)導(dǎo)致不可重復(fù)讀和第二類丟失更新的并發(fā)問題。在可能出現(xiàn)這種問題的場(chǎng)合,可以在應(yīng)用程序中采用樂觀鎖或悲觀鎖來避免這類問題。Java高端培訓(xùn)24樂觀鎖(Optimistic Locking)樂觀鎖假定當(dāng)前事務(wù)操縱數(shù)據(jù)資源時(shí),不會(huì)有其他事務(wù)同時(shí)訪問該數(shù)據(jù)資源,因此不作數(shù)據(jù)庫(kù)層次上的鎖定。為了維護(hù)正確的數(shù)據(jù),樂觀鎖使用應(yīng)用程序上的版本控制(由程序邏輯來實(shí)現(xiàn)的)來避免可能出現(xiàn)的并發(fā)問題。唯一能夠同時(shí)保持高并發(fā)和高可伸縮性的方法就是使用帶版本化的樂觀并發(fā)控制。版本
17、檢查使用版本號(hào)()或者時(shí)間戳()來檢測(cè)更新沖突并防止更新丟失。Java高端培訓(xùn)25使用進(jìn)行版本控制原理:在數(shù)據(jù)庫(kù)表中加入一個(gè)version(版本)字段,在讀取數(shù)據(jù)時(shí)連同版本號(hào)一起讀取。在更新數(shù)據(jù)時(shí)先比較新數(shù)據(jù)的版本號(hào)與數(shù)據(jù)庫(kù)表中的版本號(hào):如果等于數(shù)據(jù)庫(kù)表中的版本號(hào)則予以更新,并遞增版本號(hào)。如果小于數(shù)據(jù)庫(kù)表中的版本號(hào)就拋出異常。Hibernate在其數(shù)據(jù)庫(kù)訪問引擎中內(nèi)置了樂觀鎖定實(shí)現(xiàn),默認(rèn)也是選擇version方式作為Hibernate樂觀鎖定實(shí)現(xiàn)機(jī)制。步驟:在持久化類中定義一個(gè)代表版本號(hào)的屬性。類型:long, integer, short在對(duì)象關(guān)系映射文件中用標(biāo)記來建立持久化類的versio
18、n屬性與表中version字段的映射,一定要定義在一定要定義在元素后面元素后面。完成以上兩個(gè)步驟后,在配置文件及程序中就無須作其它設(shè)置,按往常一樣寫操作代碼就可以了。Java高端培訓(xùn)26示例Java高端培訓(xùn)27public class Product implements java.io.Serializable private Long id ; private int version; /版本號(hào) private String name; /產(chǎn)品名 private String description; /描述-簡(jiǎn)介 private Double unitCost; /單價(jià) private Date pubTime; /生產(chǎn)日期 . Product.javaProduct.hbm.xml注意事項(xiàng)使用時(shí)間戳()也可以完成樂觀鎖定機(jī)制,但不是特別安全的實(shí)現(xiàn)。用法跟版本檢查相似。由于樂觀鎖定是使用系統(tǒng)中的程序來控制,而不是使用數(shù)據(jù)庫(kù)中的鎖定機(jī)制,因而如果有人故意自行更新版本
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《牛的繁殖技術(shù)》課件
- 污水處理多源數(shù)據(jù)融合-洞察分析
- 虛擬現(xiàn)實(shí)兼容性-洞察分析
- 炭疽疫苗毒株變異分析-洞察分析
- 游戲劇情制作與敘事設(shè)計(jì)-洞察分析
- 醫(yī)保年度工作總結(jié)范文(7篇)
- 托烷司瓊與藥物不良反應(yīng)-洞察分析
- 消費(fèi)升級(jí)與個(gè)性化需求-洞察分析
- 虛擬試戴技術(shù)應(yīng)用分析-洞察分析
- 醫(yī)生個(gè)人工作總結(jié)范文1500字(7篇)
- 整理收納師職業(yè)規(guī)劃
- 商業(yè)可行性論證報(bào)告
- 檢驗(yàn)中心安全培訓(xùn)試題
- 鋼絲繩吊裝時(shí)最大允許吊裝重物對(duì)應(yīng)表
- 小學(xué)生新年新氣象主題班會(huì)
- 黑龍江省雞西市2023-2024學(xué)年上學(xué)期第二次質(zhì)量監(jiān)測(cè)九年級(jí)(五四年制)英語(yǔ)試卷
- 《機(jī)械基礎(chǔ)(第七版)》期末考試復(fù)習(xí)題庫(kù)(含答案)
- 鄉(xiāng)村振興與創(chuàng)新創(chuàng)業(yè):激發(fā)農(nóng)村創(chuàng)新創(chuàng)業(yè)活力
- 校園修繕施工方案
- 2018年全國(guó)統(tǒng)一施工機(jī)械臺(tái)班費(fèi)用定額
- 軟裝設(shè)計(jì)合同范本
評(píng)論
0/150
提交評(píng)論