關於Spring聲明式事務管理的簡單概述


一、以下對於Spring 的聲明式事務管理,簡單概述:

1、Spring 的聲明式事務管理在底層是建立在 AOP 的基礎上。其本質是在方法前后進行攔截,然后在目標方法開始之前創建一個事務,在執行這目標方法結束后,根據執行情況提交或進行回滾事務。

2、聲明式事務最大的優點就是不需通過編程的方式而進行管理事務,這樣就不需要在業務邏輯代碼中摻雜事務管理的代碼,只需在配置文件中做相關的事務規則聲明,便可將事務規則應用到業務邏輯中。

3、聲明式事務不足的地方在於,與編程式事務相比,只能作用到方法級別,無法像編程式事務那樣可以作用到代碼塊級別。

 

 

以下為Spring 提供的聲明式事務管理功能:

 

二、Spring配置文件需增加以下配置語句:

 

 

 

 

 

1.以下為<tx:method>的屬性:

 

屬性 是否需要? 默認值 描述
name  

與事務屬性關聯的方法名。通配符(*)可以用來指定一批關聯到相同的事務屬性的方法。 如:'get*''handle*''on*Event'等等。

propagation REQUIRED

事務傳播行為,可選的有:

REQUIRED:指定當前方法必需在事務環境中運行,如果當前有事務環境就加入當前正在執行的事務環境,如果當前沒有事務,就新建一個事務。這是默認值。 
SUPPORTS:指定當前方法加入當前事務環境,如果當前沒有事務,就以非事務方式執行。 
MANDATORY:指定當前方法必須加入當前事務環境,如果當前沒有事務,就拋出異常。 
REQUIRES_NEW:指定當前方法總是會為自己發起一個新的事務,如果發現當前方法已運行在一個事務中,則原有事務被掛起,我自己創建一個屬於自己的事務,直我自己這個方法commit結束,原先的事務才會恢復執行。 
NOT_SUPPORTED:指定當前方法以非事務方式執行操作,如果當前存在事務,就把當前事務掛起,等我以非事務的狀態運行完,再繼續原來的事務。 
NEVER:指定當前方法絕對不能在事務范圍內執行,如果方法在某個事務范圍內執行,容器就拋異常,只有沒關聯到事務,才正常執行。 
NESTED:指定當前方法執行時,如果已經有一個事務存在,則運行在這個嵌套的事務中.如果當前環境沒有運行的事務,就新建一個事務,並與父事務相互獨立,這個事務擁有多個可以回滾的保證點。就是指我自己內部事務回滾不會對外部事務造成影響,只對DataSourceTransactionManager事務管理器起效。 

isolation DEFAULT

事務隔離級別,可選的有:

DEFAULT:采用數據庫默認隔離級別 
SERIALIZABLE:最嚴格的級別,事務串行執行,資源消耗最大; 
REPEATABLE_READ:保證了一個事務不會修改已經由另一個事務讀取但未提交(回滾)的數據。避免了“臟讀取”和“不可重復讀取”的情況,但是帶來了更多的性能損失。 
READ_COMMITTED:大多數主流數據庫的默認事務等級,保證了一個事務不會讀到另一個並行事務已修改但未提交的數據,避免了“臟讀取”。該級別適用於大多數系統。 
READ_UNCOMMITTED:保證了讀取過程中不會讀取到非法數據。隔離級別在於處理多事務的並發問題。 

timeout -1 事務超時的時間(以秒為單位)
read-only false 事務是否只讀?
rollback-for  

將被觸發進行回滾的 Exception(s);以逗號分開。 如:'com.foo.MyBusinessException,ServletException'

no-rollback-for  

 被觸發進行回滾的 Exception(s);以逗號分開。 如:'com.foo.MyBusinessException,ServletException'

2.需要將openSession獲取會話的方式改為getCurrentSession:

 

//Session session=sessionFactory.openSession();
Session session=sessionFactory.getCurrentSession();

 

openSession與getCurrentSession兩者的區別:

1.getCurrentSession的方式會在事務結束時自動關閉連接,而openSession則需要手動關閉連接。

2.采用getCurrentSession創建的session會綁定帶當前的線程中去,但openSession則不會。

 

三、@Transactional注解定義事務:

該注解常用的屬性和<tx:method>中的屬性一樣,采用@Transactional注解方式如下:

@Transactional    //放在這里表示類的所有方法都加入事務管理  
public class NewsServiceImpl implements NewsService{
  ······
}    
//也可以在單個方法上加注解
@Transactional(readOnly=true)    
public List showAllNews() {
  ······
}    

在Spring配置文件之中,還需要加入以下配置通知Spring容器,並且對注解@Transactional的Bean處理。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM