springboot註解式事務詳解

2021-09-23 07:51:53 字數 2893 閱讀 7920

springboot使用事務需要在啟動類上加上開啟事務註解:@enabletransactionmanagement

事物註解方式: @transactional

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

@service

@transactional

public class logserviceimpl implements logservice

當標於方法上時, 標示該方法都進行事物處理 , 例子:

/**

* 刪除使用者

* @return

*/@override

@transactional

public void delete(long id)

事物傳播行為介紹:

@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=)

norollbackfor:

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

@transactional(norollbackfor=)

注意點:

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

拓展:

transactional readonly 和 不加transactional的區別:

1.不加@transactional,sql執行的時候是沒有事務的,對於方法內只有一條sql是加與不加結果不影響但是如果乙個方法內執行了多條查詢sql,不加@transactional無法保證資料前後一致性。

例子:乙個方法內有2個同樣乙個sql,當執行完第一條sql時,資料被改掉了,這時如果沒有加@transactional,那麼第二條查詢結果會是被修改後的資料,這樣就出現了類似不可重複讀的情況。

如果加上@transactional,那麼第二條查詢的結果和第一條一樣是修改前的資料,保證資料前後一致性.

2.在資料庫層面已經保證了該sql的原子性.所以如果乙個方法中只有單條sql,不需要加事務,再加事務只會浪費效能。

SpringBoot事務註解詳解

關係型資料庫多用到事務,在傳統專案中使用xml配置,配置雖然也還好,但是看著很不美觀,在使用springboot框架,就簡單的多了,以實戰為準,直接上 transactional spring 事務註解 1.簡單開啟事務管理 enabletransactionmanagement 啟註解事務管理,等...

SpringBoot事務註解詳解

transactional spring 事務註解 1.簡單開啟事務管理 enabletransactionmanagement 啟註解事務管理,等同於xml配置方式的2.事務註解詳解 預設遇到throw new runtimeexception 會回滾 需要捕獲的throw new excepti...

快速上手SpringBoot事務註解

什麼是事務 資料庫事務,是指作為單個邏輯工作單元執行的一系列操作,要麼完全執行,要麼完全不執行 事務的特性 原子性 乙個事務中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。一致性 在事務開始之前和事務結束以後,資料庫的完整性沒有被破壞。隔離性 防止多個事務併發執行時由於交叉執行而...