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