使用事務的目的是將整個業務的邏輯處理置於同乙個事務中,方便對整個業務進行管理,如業務的事務回滾;
在編寫**時,為了將乙個業務的核心邏輯處理放入事務中,有時會這樣寫:
session session = sf.opensession();//開啟乙個session
session.gettransaction().begin();//開啟乙個事務
query query = session.createquery("from news");//核心邏輯處理
listallnewlist = query.getresultlist();//核心邏輯處理
session.gettransaction().commit();//提交事務
session.close();//關閉session
如果乙個專案中有很多個業務都要用到事務,那麼每次都需要將開啟session、開啟事務、提交事務、關閉session等步驟執行一遍,如果每次都直接編寫相應的**來執行,肯定不合適,因為這幾個步驟都是固定不變,所以我們可以利用spring的aop,將這幾個步驟放到橫切關注點中,交由spring來幫我們執行,而我們只需要宣告一下,告訴spring,哪些業務需要使用事務
id="transactionmanager"
class="org.springframework.orm.hibernate5.hibernatetransactionmanager">
name="sessionfactory"
ref="sessionfactory"/>
bean>
id="txadvice"
transaction-manager="transactionmanager">
name="add*"
propagation="required"/>
name="del*"
propagation="required"/>
name="get*"
propagation="required"
read-only="true"/>
name="*"
propagation="required"
read-only="true"/>
tx:attributes>
tx:advice>
id="txpointcut"
expression="execution(* news.service.*.*(..))" />
advice-ref="txadvice"
pointcut-ref="txpointcut"/>
aop:config>
2.修改之前的事務處理 ;
session session = sf.opensession();//開啟乙個session
session.gettransaction().begin();//開啟乙個事務
query query = session.createquery("from news");//核心邏輯處理
listallnewlist = query.getresultlist();//核心邏輯處理
session.gettransaction().commit();//提交事務
session.close();//關閉session
改為:
session session = sf.getcurrentsession();//獲取session
query query = session.createquery("from news");//核心邏輯處理
list
allnewlist = query.getresultlist();//核心邏輯處理
opensession()是新建乙個session,在使用宣告式事務管理後,事務都交由spring去處理,不必再寫開啟事務、提交事務的**,同時所有的transaction都使用同乙個session,這個session是spring來管理的的,所以無需再自己open乙個新的session,直接向spring get即可,而且get了spring的session後,無需編寫close(),spring會自動幫我們關閉,而如果不小心用的是自己open的新的session,最後還要自己寫close(),spring不會自動幫我們關閉 Spring宣告式事務管理
spring的宣告式事務管理,可以說是開發人員的福音,也是架構師們的法寶 通過這個神器我們可以有效的解決事務不一致 連線洩露等問題 下面我們就介紹一下spring宣告式事務的配置 1 建立事務管理器 2 制定事務管理 3 建立切面 備註 事務管理機制說明propagation 屬性值 require...
Spring宣告式事務管理
classpath hibernate.cfg.xml public class usermanagerimpl extends hibernatedaosupport implements usermanager public void adduser user user throws excep...
spring 宣告式事務管理
在spring中經常用transactionproxyfactorybean完成宣告式事務管理 使用transactionproxyfactorybean 需要注入它所依賴的事務管理器,設定 的目標物件,物件的生成方式和事務屬性.物件時再目標物件上生成的包含事務和aop切面的新物件,它可以賦給目標的...