一、以下對於Spring 的聲明式事務管理,簡單概述:
1、Spring 的聲明式事務管理在底層是建立在 AOP 的基礎上。其本質是在方法前后進行攔截,然后在目標方法開始之前創建一個事務,在執行這目標方法結束后,根據執行情況提交或進行回滾事務。
2、聲明式事務最大的優點就是不需通過編程的方式而進行管理事務,這樣就不需要在業務邏輯代碼中摻雜事務管理的代碼,只需在配置文件中做相關的事務規則聲明,便可將事務規則應用到業務邏輯中。
3、聲明式事務不足的地方在於,與編程式事務相比,只能作用到方法級別,無法像編程式事務那樣可以作用到代碼塊級別。
以下為Spring 提供的聲明式事務管理功能:
二、Spring配置文件需增加以下配置語句:
1.以下為<tx:method>的屬性:
屬性 | 是否需要? | 默認值 | 描述 |
---|---|---|---|
name |
是 | 與事務屬性關聯的方法名。通配符(*)可以用來指定一批關聯到相同的事務屬性的方法。 如: |
|
propagation |
否 | REQUIRED | 事務傳播行為,可選的有: REQUIRED:指定當前方法必需在事務環境中運行,如果當前有事務環境就加入當前正在執行的事務環境,如果當前沒有事務,就新建一個事務。這是默認值。 |
isolation |
否 | DEFAULT | 事務隔離級別,可選的有: DEFAULT:采用數據庫默認隔離級別 |
timeout |
否 | -1 | 事務超時的時間(以秒為單位) |
read-only |
否 | false | 事務是否只讀? |
rollback-for |
否 | 將被觸發進行回滾的 |
|
no-rollback-for |
否 | 不 被觸發進行回滾的 |
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處理。