Transactional註解用法

2021-10-25 08:01:56 字數 1297 閱讀 9048

1. 事務隔離級別

隔離級別是指若干個併發的事務之間的隔離程度。transactiondefinition 介面中定義了五個表示隔離級別的常量:

2. 事務傳播行為

所謂事務的傳播行為是指,如果在開始當前事務之前,乙個事務上下文已經存在,此時有若干選項可以指定乙個事務性方法的執行行為。在transactiondefinition定義中包括了如下幾個表示傳播行為的常量:

3. 事務超時

所謂事務超時,就是指乙個事務所允許執行的最長時間,如果超過該時間限制但事務還沒有完成,則自動回滾事務。在 transactiondefinition 中以 int 的值來表示超時時間,其單位是秒。

預設設定為底層事務系統的超時值,如果底層資料庫事務系統沒有設定超時值,那麼就是none,沒有超時限制。

4. spring事務回滾規則

spring使用宣告式事務處理,預設情況下,如果被註解的資料庫操作方法中發生了unchecked異常,所有的資料庫操作將rollback;如果發生的異常是checked異常,預設情況下資料庫操作還是會提交的。

注:預設情況下,spring會對unchecked(runtimeexception、error)異常進行事務回滾;但是checked(exception)異常則不回滾。

如何讓checked異常時也回滾?如配置@transactional(rollbackfor=exception.class)exception是runtimeexception的父類,這樣的配置就包含了(checkedunchecked),專案中推薦這種配置

@transactional 可以作用於介面、介面方法、類以及類方法上。當作用於類上時,該類的所有 public 方法將都具有該型別的事務屬性,同時,我們也可以在方法級別使用該標註來覆蓋類級別的定義。

雖然 @transactional 註解可以作用於介面、介面方法、類以及類方法上,但是 spring 建議不要在介面或者介面方法上使用該註解,因為這只有在使用基於介面的**時它才會生效。另外,@transactional 註解應該只被應用到 public 方法上,這是由 spring aop 的本質決定的。如果你在 protected、private 或者預設可見性的方法上使用 @transactional 註解,這將被忽略,也不會丟擲任何異常。

預設情況下,只有來自外部的方法呼叫才會被aop**捕獲,也就是,類內部方法呼叫本類內部的其他方法並不會引起事務行為,即使被呼叫方法使用@transactional註解進行修飾。

參考 :

Transactional註解初見

之前一直使用宣告式事務,切面程式設計的配置方式讓程式設計者忘記了事務的存在,一旦離開,發現這個事務還是蠻重要的 public inte ce userservice transactional public class userserviceimpl implements userservice p...

Transactional註解詳解

預設遇到throw new runtimeexception 會回滾 需要捕獲的throw new exception 不會回滾 指定回滾 transactional rollbackfor exception.class public void methodname 指定不回滾 transacti...

Transactional註解怎麼使用?

1 在方法或者類上都可以新增。如果在類上新增,則此類中的所有方法都會執行事務,不推薦,因為可能後續接手開發的小夥伴新增方法的時候根本不需要執行事務 2 觸發事務回滾有兩種方式 3 推薦在註解上新增 transactional rollbackfor 如果不加的話,方法預設只會在丟擲runtimeex...