Transactional註解失效場景

2021-10-25 16:20:42 字數 2722 閱讀 4279

@transactional註解相信大家並不陌生,平時開發中很常用的乙個註解,它能保證方法內多個資料庫操作要麼同時成功、要麼同時失敗。使用@transactional註解時需要注意許多的細節,不然你會發現@transactional總是莫名其妙的就失效了。

本文採取**方式,便於理解,疏漏之處,還望指正,謝謝

事務管理在系統開發中是不可缺少的一部分,spring提供了很好事務管理機制,主要分為程式設計式事務宣告式事務兩種。

程式設計式事務:是指在**中手動的管理事務的提交、回滾等操作,**侵入性比較強,如下示例:

宣告式事務:基於aop面向切面的,它將具體業務與事務處理部分解耦,**侵入性很低,所以在實際開發中宣告式事務用的比較多。宣告式事務也有兩種實現方式,一是基於tx和aop的xml配置檔案方式,二種就是基於@transactional註解。

作用於類:當把@transactional 註解放在類上時,表示所有該類的public方法都配置相同的事務屬性資訊。

作用於方法:當類配置了@transactional,方法也配置了@transactional,方法的事務會覆蓋類的事務配置資訊。

作用於介面:不推薦這種使用方法,因為一旦標註在inte***ce上並且配置了spring aop 使用cglib動態**,將會導致@transactional註解失效

@transactional 註解屬性 : propagation 事務的傳播行為

isolation 屬性:事務的隔離級別

isolation 事務的隔離級別存在的:髒讀、不可重複讀、幻讀

@transactional 註解屬性:timeout 、readonly、rollbackfor 、norollbackfor

@transactional 應用在非 public 修飾的方法上

如果transactional註解應用在非public修飾的方法上,transactional將會失效。 之所以會失效是因為事務是通過spring aop**的基礎上實現的,如上圖所示

@transactional 註解屬性 propagation 設定錯誤

這種失效是由於配置錯誤,若是錯誤的配置以下三種propagation,事務將不會發生回滾。

@transactional 註解屬性 rollbackfor 設定錯誤

同乙個類中方法呼叫,導致@transactional失效

異常被 catch「掉了」導致@transactional失效

資料庫引擎不支援事務

事務能否生效,資料庫引擎是否支援事務是關鍵。常用的mysql資料庫預設使用支援事務的innodb引擎。一旦資料庫引擎切換成不支援事務的myisam,事務就失效了。

@transactional應用在非public修飾的方法上, 失效

@transactional註解屬性propagation設定錯誤, 失效

@transactional註解屬性rollbackfor設定錯誤, 失效

@transactional同乙個類中方法呼叫,導致@transactional失效

@transactional異常被catch「掉了」導致@transactional失效

@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.事務隔離級別 隔離級別是指若干個併發的事務之間的隔離程度。transactiondefinition 介面中定義了五個表示隔離級別的常量 2.事務傳播行為 所謂事務的傳播行為是指,如果在開始當前事務之前,乙個事務上下文已經存在,此時有若干選項可以指定乙個事務性方法的執行行為。在transacti...