?????? 在現(xiàn)在的B/S體系結(jié)構(gòu)的軟件開(kāi)發(fā)中,對(duì)于數(shù)據(jù)庫(kù)事務(wù)處理中最常使用的方式是每個(gè)用戶請(qǐng)求一個(gè)事務(wù)。也就是說(shuō),當(dāng)服務(wù)器端接收到一個(gè)用戶請(qǐng)求后,會(huì)開(kāi)始一個(gè)新的事務(wù),直到對(duì)用戶請(qǐng)求的所有處理都進(jìn)行完畢并且完成了響應(yīng)用戶請(qǐng)求的所有輸出之后才會(huì)關(guān)閉這個(gè)事務(wù)。
?????? 對(duì)于使用Hibernate實(shí)現(xiàn)持久化功能的系統(tǒng)來(lái)說(shuō),事務(wù)的處理是這樣的:服務(wù)器端在接收到用戶的請(qǐng)求后,會(huì)創(chuàng)建一個(gè)新的Hibernate Session對(duì)象,然后通過(guò)該Session對(duì)象開(kāi)始一個(gè)新的事務(wù)并且之后所有對(duì)數(shù)據(jù)庫(kù)的操作都通過(guò)該Session對(duì)象來(lái)進(jìn)行。最后,完成將響應(yīng)頁(yè)面發(fā)送到客戶端的工作后再提交事務(wù)并且關(guān)閉Session。
?????? Session的對(duì)象是輕型的,非線程安全的,所以在每次用戶請(qǐng)求時(shí)創(chuàng)建,請(qǐng)求處理完畢后丟棄。
?????? 那么,該如何實(shí)現(xiàn)這種方式的事務(wù)處理呢?處理的難點(diǎn)在于如何在業(yè)務(wù)處理之前創(chuàng)建Session并開(kāi)始事務(wù)以及在業(yè)務(wù)處理之后提交事務(wù)并關(guān)閉Session。對(duì)于現(xiàn)在的Web應(yīng)用來(lái)說(shuō),通常情況下是通過(guò)ServletFilter來(lái)完成事務(wù)處理的操作。這樣,就可以輕松地實(shí)現(xiàn)在用戶請(qǐng)求到達(dá)服務(wù)器端的時(shí)候創(chuàng)建Session并開(kāi)始事務(wù),而服務(wù)器端響應(yīng)處理結(jié)束之前提交事務(wù)并關(guān)閉Session。
?????? 另外一個(gè)問(wèn)題是,在ServletFilter中創(chuàng)建的Session是如何傳遞給業(yè)務(wù)處理方法中的呢?處理的方法是通過(guò)一個(gè)ThreadLocal變量來(lái)把創(chuàng)建的Session對(duì)象綁定到處理用戶請(qǐng)求的線程上去,這樣就可以使任何的業(yè)務(wù)處理方法可以輕松得到Session對(duì)象。
?????? Hibernate中事務(wù)處理的具體方法可以參照前面的網(wǎng)絡(luò)博客的實(shí)例。
?????? 但是這種事務(wù)處理的方式還是會(huì)遇到一些問(wèn)題,其中最突出的就是更新沖突的問(wèn)題。例如,某個(gè)操作人員進(jìn)入了用戶信息的修改頁(yè)面,在經(jīng)過(guò)一段時(shí)間的對(duì)用戶信息的修改后,進(jìn)行提交操作,而與此同時(shí)可能會(huì)有另外一個(gè)操作人員也進(jìn)行了相同的操作,這樣在處理提交的時(shí)候就會(huì)產(chǎn)生沖突。
?????? 產(chǎn)生這個(gè)沖突的原因在于在開(kāi)發(fā)中需要使用多個(gè)數(shù)據(jù)庫(kù)事務(wù)來(lái)實(shí)現(xiàn)一個(gè)應(yīng)用事務(wù)。也就是說(shuō),在應(yīng)用程序?qū)?,?yīng)該將讀取用戶信息、顯示修改頁(yè)面以及用戶提交工作來(lái)作為一個(gè)事務(wù)進(jìn)行處理,在處理的過(guò)程中應(yīng)該避免其他操作人員進(jìn)行類似的操作。
?????? 回想前面的介紹,我們對(duì)于數(shù)據(jù)庫(kù)事務(wù)所采取的策略是每個(gè)用戶請(qǐng)求一個(gè)事務(wù),而上面的業(yè)務(wù)處理則至少需要兩個(gè)請(qǐng)求才能完成。這樣,兩者之間就存在著一定的矛盾,這也就導(dǎo)致了不可重復(fù)讀取和兩次更新問(wèn)題的發(fā)生。
?????? 為了解決并發(fā)中數(shù)據(jù)訪問(wèn)的問(wèn)題,通常會(huì)采用鎖的機(jī)制來(lái)實(shí)現(xiàn)數(shù)據(jù)訪問(wèn)的排他性,從而避免兩次更新問(wèn)題的發(fā)生。
posted on 2009-07-19 21:07
jadmin 閱讀(73)
評(píng)論(0) 編輯 收藏