Transactional 失效的場景

2021-10-07 05:19:33 字數 909 閱讀 4868

1.非public方法上使用會失效

2.開發中避免不了會對同乙個類裡面的方法呼叫,比如有乙個類test,它的乙個方法a,a再呼叫本類的方法b(不論方法b是用public還是private修飾),但方法a沒有宣告註解事務,而b方法有。則外部呼叫方法a之後,方法b的事務是不會起作用的。這也是經常犯錯誤的乙個地方。

那為啥會出現這種情況?其實這還是由於使用spring aop**造成的,因為只有當事務方法被當前類以外的**呼叫時,才會由spring生成的**物件來管理。

3.@transactional 註解屬性 propagation 設定錯誤

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

transactiondefinition.propagation_supports:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續執行。 transactiondefinition.propagation_not_supported:以非事務方式執行,如果當前存在事務,則把當前事務掛起。 transactiondefinition.propagation_never:以非事務方式執行,如果當前存在事務,則丟擲異常。

4.@transactional 註解屬性 rollbackfor 設定錯誤

ollbackfor 可以指定能夠觸發事務回滾的異常型別。spring預設丟擲了未檢查unchecked異常(繼承自 runtimeexception 的異常)或者 error才回滾事務;其他異常不會觸發回滾事務。如果在事務中丟擲其他型別的異常,但卻期望 spring 能夠回滾事務,就需要指定 rollbackfor屬性。

5.當異常被catch住了,事務控制也會失效

6.常用的mysql資料庫預設使用支援事務的innodb引擎。一旦資料庫引擎切換成不支援事務的myisam,那事務就從根本上失效了。(少見)

Transactional 失效問題

transactional配置起來是簡單方便,但是坑也相當多,下面就記錄下這些坑。1 service類標籤新增在了介面上,查閱資料說介面的方法上可以加也不建議這樣用,但實際中這麼出現事務失效。2 transactional 註解只能應用到 public 可見度的方法上。3 預設情況下,spring會...

Transactional事物失效解決

這麼乙個類 public class foopublic void baz 可能會有不少人會跟我一樣,覺得上面這種方式呼叫 baz 方法時,bar 上的 transactional註解還是會起作用的,即bar 在被呼叫時,將會開啟事務。但是,當實際操作之後,你會發現,這樣並不會開啟新的事務?為什麼呢...

Transactional的失效場景

transactional我們在日常開發中經常用到,可能會經常遇到 transactional失效的情況。下面將從what where when三個方面講解 transactional。事務 transaction 是指我們做的一系列完整的事情,在事務中,任何一步出現了問題,這件事情就未算完成。這裡...