1. 程式人生 > >spring @Transactional註解引數詳解

spring @Transactional註解引數詳解

事物註解方式: @Transactional

當標於類前時, 標示類中所有方法都進行事物處理 , 例子:

@Transactional public class TestServiceBean implements TestService {}

當類中某些方法不需要事物時:
@Transactional
public class TestServiceBean implements TestService {
private TestDao dao;
public void setDao(TestDao dao) {
this.dao = dao;
}
@Transactional(propagation =Propagation.NOT_SUPPORTED)
public List getAll() {
return null;
}
}

事物傳播行為介紹:

  @Transactional(propagation=Propagation.REQUIRED) :如果有事務, 那麼加入事務, 沒有的話新建一個(預設情況下)
  @Transactional(propagation=Propagation.NOT_SUPPORTED) :容器不為這個方法開啟事務
  @Transactional(propagation=Propagation.REQUIRES_NEW) :不管是否存在事務,都建立一個新的事務,原來的掛起,新的執行完畢,繼續執行老的事務
  @Transactional(propagation=Propagation.MANDATORY) :必須在一個已有的事務中執行,否則丟擲異常
  @Transactional(propagation=Propagation.NEVER) :必須在一個沒有的事務中執行,否則丟擲異常(與Propagation.MANDATORY相反)
  @Transactional(propagation=Propagation.SUPPORTS) :如果其他bean呼叫這個方法,在其他bean中宣告事務,那就用事務.如果其他bean沒有宣告事務,那就不用事務.

事物超時設定:

  @Transactional(timeout=30) //預設是30秒

事務隔離級別:

  @Transactional(isolation = Isolation.READ_UNCOMMITTED):讀取未提交資料(會出現髒讀, 不可重複讀) 基本不使用
  @Transactional(isolation = Isolation.READ_COMMITTED):讀取已提交資料(會出現不可重複讀和幻讀)
  @Transactional(isolation = Isolation.REPEATABLE_READ):可重複讀(會出現幻讀)
  @Transactional(isolation = Isolation.SERIALIZABLE):序列化

  MYSQL: 預設為REPEATABLE_READ級別
  SQLSERVER: 預設為READ_COMMITTED

髒讀 : 一個事務讀取到另一事務未提交的更新資料
不可重複讀 : 在同一事務中, 多次讀取同一資料返回的結果有所不同, 換句話說,
後續讀取可以讀到另一事務已提交的更新資料. 相反, “可重複讀”在同一事務中多次
讀取資料時, 能夠保證所讀資料一樣, 也就是後續讀取不能讀到另一事務已提交的更新資料
幻讀 : 一個事務讀到另一個事務已提交的insert資料

@Transactional註解中常用引數說明

引數名稱

功能描述

readOnly

該屬性用於設定當前事務是否為只讀事務,設定為true表示只讀,false則表示可讀寫,預設值為false。例如:@Transactional(readOnly=true)

rollbackFor

該屬性用於設定需要進行回滾的異常類陣列,當方法中丟擲指定異常陣列中的異常時,則進行事務回滾。例如:

指定單一異常類:@Transactional(rollbackFor=RuntimeException.class)

指定多個異常類:@Transactional(rollbackFor={RuntimeException.class, Exception.class})

rollbackForClassName

該屬性用於設定需要進行回滾的異常類名稱陣列,當方法中丟擲指定異常名稱陣列中的異常時,則進行事務回滾。例如:

指定單一異常類名稱:@Transactional(rollbackForClassName=”RuntimeException”)

指定多個異常類名稱:@Transactional(rollbackForClassName={“RuntimeException”,”Exception”})

noRollbackFor

該屬性用於設定不需要進行回滾的異常類陣列,當方法中丟擲指定異常陣列中的異常時,不進行事務回滾。例如:

指定單一異常類:@Transactional(noRollbackFor=RuntimeException.class)

指定多個異常類:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})

noRollbackForClassName

該屬性用於設定不需要進行回滾的異常類名稱陣列,當方法中丟擲指定異常名稱陣列中的異常時,不進行事務回滾。例如:

指定單一異常類名稱:@Transactional(noRollbackForClassName=”RuntimeException”)

指定多個異常類名稱:

@Transactional(noRollbackForClassName={“RuntimeException”,”Exception”})

propagation

該屬性用於設定事務的傳播行為,具體取值可參考表6-7。

例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)

isolation

該屬性用於設定底層資料庫的事務隔離級別,事務隔離級別用於處理多事務併發的情況,通常使用資料庫的預設隔離級別即可,基本不需要進行設定

timeout

該屬性用於設定事務的超時秒數,預設值為-1表示永不超時

注意的幾點:

  1、@Transactional 只能被應用到public方法上, 對於其它非public的方法,如果標記了@Transactional也不會報錯,但方法沒有事務功能.

  2、用 spring 事務管理器,由spring來負責資料庫的開啟,提交,回滾.預設遇到執行期例外(throw new RuntimeException(“註釋”);)會回滾,即遇到不受檢查(unchecked)的例外時回滾;而遇到需要捕獲的例外(throw new Exception(“註釋”);)不會回滾,即遇到受檢查的例外(就是非執行時丟擲的異常,編譯器會檢查到的異常叫受檢查例外或說受檢查異常)時,需我們指定方式來讓事務回滾要想所有異常都回滾,要加上 @Transactional( rollbackFor={Exception.class,其它異常}) .如果讓unchecked例外不回滾: @Transactional(notRollbackFor=RunTimeException.class)
如下:
@Transactional(rollbackFor=Exception.class) //指定回滾,遇到異常Exception時回滾
public void methodName() {
   throw new Exception(“註釋”);
}
@Transactional(noRollbackFor=Exception.class)//指定不回滾,遇到執行期例外(throw new RuntimeException(“註釋”);)會回滾
public ItimDaoImpl getItemDaoImpl() {
   throw new RuntimeException(“註釋”);
}

  3、@Transactional 註解應該只被應用到 public 可見度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 註解,它也不會報錯, 但是這個被註解的方法將不會展示已配置的事務設定。

  4、@Transactional 註解可以被應用於介面定義和介面方法、類定義和類的 public 方法上。然而,請注意僅僅 @Transactional 註解的出現不足於開啟事務行為,它僅僅 是一種元資料,能夠被可以識別 @Transactional 註解和上述的配置適當的具有事務行為的beans所使用。上面的例子中,其實正是 元素的出現 開啟 了事務行為。

  5、Spring團隊的建議是你在具體的類(或類的方法)上使用 @Transactional 註解,而不要使用在類所要實現的任何介面上。你當然可以在介面上使用 @Transactional 註解,但是這將只能當你設定了基於介面的代理時它才生效。因為註解是不能繼承的,這就意味著如果你正在使用基於類的代理時,那麼事務的設定將不能被基於類的代理所識別,而且物件也將不會被事務代理所包裝(將被確認為嚴重的)。因此,請接受Spring團隊的建議並且在具體的類上使用 @Transactional 註解。

相關推薦

spring @Transactional註解引數

事物註解方式: @Transactional 當標於類前時, 標示類中所有方法都進行事物處理 , 例子: @Transactional public class TestServiceBean implements TestService {} 當類中某些

Spring註解式實務@Transactional註解引數

spring事務一般由AOP統一處理,但當用tx:annotation-driven進行事務管理時,就需要藉助@Transactional 事物註解方式: @Transactional 當標於類前時, 標示類中所有方法都進行事物處理 , 例子: @Service @Tra

spring mvc 註解引數@

引言: 接上一篇文章,對@RequestMapping進行地址對映講解之後,該篇主要講解request 資料到handler method 引數資料的繫結所用到的註解和什麼情形下使用; 簡介: handler method 引數繫結常用的註解,我們根據他們處理的Req

spring bean註解使用

@Bean 的用法 @Bean是一個方法級別上的註解,主要用在@Configuration註解的類裡,也可以用在@Component註解的類裡。新增的bean的id為方法名 定義bean 下面是@Configuration裡的一個例子 @Configuration publi

spring @Transactional 註解引數概要

1.可配置的引數列表 屬性 型別 描述 傳播性 列舉型:Propagation 可選的傳播性設定 隔離性 列舉型:Isolation 可選的隔離性級別(預設值:ISOLATION_DEFAULT) 只讀性 布林型

Spring @Bean 註解使用

// an HTTP Session-scoped bean exposed as a proxy @Bean @SessionScope public UserPreferences userPreferences() { return new UserPreferences(); } @Bean

Spring註解@Scope

Scope是spring中的一個註解,可以作為類註解,也可以作為方法註解,它有五個作用域,分別是singleton、prototype、request、session、global session,spring中的bean預設是使用singleton,即單例模式

spring @Transactional註解參數

正是 SQ com package don ted {} 說明 mda 事物註解方式: @Transactional 當標於類前時, 標示類中所有方法都進行事物處理 , 例子: @Transactional public class TestServiceBea

spring @Transactional註解參數(13)

基於接口 ack -a 事物 null span ports readonly 可見度 事物註解方式: @Transactional 當標於類前時, 標示類中所有方法都進行事物處理 , 例子: 1 @Transactional public class TestServ

spring的事務,註解@Transactional

事務管理是應用系統開發中必不可少的一部分。Spring 為事務管理提供了豐富的功能支援。 Spring 事務管理分為程式設計式和宣告式的兩種方式。 程式設計式事務指的是通過編碼方式實現事務,程式設計式事務管理使用TransactionTemplate或者直接使用底層的PlatformTransaction

spring AOP解析之註解方式

parser 分享 pro asp mes aop log space spec 命名空間處理器是AopNamespaceHandler,我們可以看到這裏註冊了幾個解析器,第一個我們知道是xml形式的解析,接下來我們看AspectJAutoProxyBeanDefiniti

Spring Boot中使用MyBatis註解配置(1)

sql type .org 實體 sch 整合 PE 匯總 同傳 之前在Spring Boot中整合MyBatis時,采用了註解的配置方式,相信很多人還是比較喜歡這種優雅的方式的,也收到不少讀者朋友的反饋和問題,主要集中於針對各種場景下註解如何使用,下面就對幾種常見的情況舉

6. Spring:Java註解技術

6. Spring:Java註解技術詳解 自定義註解示例:https://blog.csdn.net/wangpengzhi19891223/article/details/78131137/ Java註解技術基本概念 Annotation是Java5開始引入的新特徵。中文

Spring註解標籤@Autowired @Qualifier

@Autowired spring2.1中允許使用者通過@Autowired註解對Bean的屬性變數.屬性Setter方法以及建構函式進行標註,配合AutowiredAnnotationBeanProcessor完成Bean的自動配置。使用@Autowired註釋進行byType注入。 在a

Spring 註解@Value

一 配置方式 @value需要引數,這裡引數可以是兩種形式: @Value("#{configProperties['t1.msgname']}")或者@Value("${t1.msgname}"); 這兩形式,在配置上有什麼區別: 1、@Value("#{configPrope

Spring註解標籤@Autowired @Qualifier等 @Slf4j

 @Slf4j @Slf4j註解實現日誌輸出       自己寫日誌的時候,肯定需要: private final Logger logger = LoggerFactory.getLogger(LoggerTest.class);1每次寫新的類

Spring Boot中使用MyBatis註解配置

   轉自翟永超 之前在Spring Boot中整合MyBatis時,採用了註解的配置方式,相信很多人還是比較喜歡這種優雅的方式的,也收到不少讀者朋友的反饋和問題,主要集中於針對各種場景下註解如何使用,下面就對幾種常見的情況舉例說明用法。 在做下面的示例之前,先準備一

Java Spring Data Redis實戰與配置引數 application.properties

Redis作為開源分散式高併發快取,使用範圍非常廣泛,主流網際網路公司幾乎都在使用。 Java Spring Boot 2.0實戰開發Redis快取可以參考下面的步驟,Redis安裝可以直接使用Linux倉庫,特定版本請使用Wget下載安裝。 Java Spring Boot 2.0連線Redis伺服

Spring任務定時排程cron引數

cron表示式詳解: 一個cron表示式有至少6個(也可能7個)有空格分隔的時間元素。 按順序依次為 秒(0~59) 分鐘(0~59) 小時(0~23) 天(月)(0~31,但是你需要考慮你月的天數) 月(0~11) 天(星期)(1~7 1=SUN 或 SUN,MON,TU

Spring註解標籤@Autowired @Qualifier等

@Autowired spring2.1中允許使用者通過@Autowired註解對Bean的屬性變數.屬性Setter方法以及建構函式進行標註,配合AutowiredAnnotationBeanProcessor完成Bean的自動配置。使用@Autowired註釋進行b