javascript
由openSession、getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持
由openSession、getCurrentSession和HibernateDaoSupport淺談Spring對事物的支持
??? Spring和Hibernate的集成的一個要點就是對事務的支持,openSession、getCurrentSession都是編程式事務(手動設置事務的提交、回滾)中重要的對象,HibernateDaoSupport則提供了更方便的聲明式事務支持。
??? Hibernate中最重要的就是Session對象的引入,它是對jdbc的深度封裝,包括對事務的處理,Session對象通過SessionFactory來管理,openSession和getCurrentSession是管理session的重要的方法。
??? openSession和getCurrentSession的根本區別在于有沒有綁定當前線程,所以,使用方法有差異:
* openSession沒有綁定當前線程,所以,使用完后必須關閉,
* currentSession和當前線程綁定,在事務結束后會自動關閉。
關于事務的邊界和傳播:
???? 通常情況下事務的邊界需要設置在業務邏輯處理層中,但是,如果在一個業務中涉及到多個業務邏輯層之間的方法,且需要在同一個事務中運行,那么,這就涉及到了事務的傳播性。
如果使用openSession,就要在dao層的方法中傳遞session,而這種做法是很糟糕的,首先增加了參數的個數,另外,方法是否需要事務,完全是可以當做一種獨立的服務抽離出的。
因為currentSession是線程級別的,所以,只要業務邏輯方法在同一個線程中,就不會擔心上面的問題。這也是currentSession的一個優越處之一。
使用currentSession:
1.在配置文件中將線程配置成Thread級別的。
?
[html] view plaincopyprint?2.調用sessionFactory的getCurrentSession方法:
?
[java] view plaincopyprint??
使用openSession:
?
[java] view plaincopyprint?使用HibernateDaoSupport聲明式事務:
??? Spring與Hibernate的集成使用最多的是HibernateDaoSupport,它對session的獲取以及事務做了進一步的封裝,只需要關注dao的實現,而不用擔心某個地方的事務是否關閉。
?
[java] view plaincopyprint??
關于異常與事務回滾:???
??? Spring在遇到運行期異常(繼承了RuntimeException)的時候才會回滾,如果是Exception(如用戶輸入密碼錯誤)拋出就好,事務會繼續往下進行。
??? Spring對異常的處理的靈活性還是比較高的,可以配置遇到某個Exception進行回滾,某個RuntimeException不回滾,但是對于EJB就沒有這么靈活了,EJB相當于是固定的套餐。
不會回滾:??
?
[java] view plaincopyprint?回滾:
?
[java] view plaincopyprint??
?
Spring與Hibernate的集成,使用HibernateDaoSupport的配置:
?? 在ssh框架應用中,Spring與Hibernate的事務集成基本上是比較固定的,我們把事務的集成單獨配置到applicationContext-common.xml中:
?
[html] view plaincopyprint??
因為在hibernate.cfg.xml中添加了如下配置,所以,在tomcat等容器啟動的時候,會自動將相應的bean對象創建。
?
[html] view plaincopyprint??
applicationContext-beans.xml:
??? 通常將業務邏輯對實現類的引用單獨的xml文件中,同時,在實現類中不能忽略sessionFactory工廠的注入。
?
[html] view plaincopyprint?事務傳播特性:
?? 為了保證調用的業務邏輯方法都使用同一個事務,通常都使用REQUIRED這個級別,它表示:如果上一個方法中有事務,就直接使用,如果沒有,就創建一個事務,這樣,一旦事務創建了后,后續調用的方法就不會再創建。
?? 其他的事務傳播特性見下表:
?
Spring事務的隔離級別:
?? 1. ISOLATION_DEFAULT: 這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別。
?? ???? 另外四個與JDBC的隔離級別相對應。
?? 2. ISOLATION_READ_UNCOMMITTED: 這是事務最低的隔離級別,它充許令外一個事務可以看到這個事務未提交的數據。
?? ???? 這種隔離級別會產生臟讀,不可重復讀和幻像讀。
?? 3. ISOLATION_READ_COMMITTED: 保證一個事務修改的數據提交后才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的數據
?? 4. ISOLATION_REPEATABLE_READ: 這種事務隔離級別可以防止臟讀,不可重復讀。但是可能出現幻像讀。
?? ???? 它除了保證一個事務不能讀取另一個事務未提交的數據外,還保證了避免下面的情況產生(不可重復讀)。
?? 5. ISOLATION_SERIALIZABLE 這是花費最高代價但是最可靠的事務隔離級別。事務被處理為順序執行。
???? 除了防止臟讀,不可重復讀外,還避免了幻像讀。
??? 事務隔離級別主要應用在對大數據的處理方面,與鎖的機制是密不可分的,這里不贅述。
轉載于:https://www.cnblogs.com/gtaxmjld/p/4819725.html
總結
以上是生活随笔為你收集整理的由openSession、getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Rokid Air、雷鸟 Air和视享G
- 下一篇: 旁边阿婆的气质,居然不输刘亦菲。真、善、