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