淺析Spring事務傳播行為和隔離級別


7個傳播行為。4個隔離級別。

Spring事務的傳播行為和隔離級別[transaction behaviorand isolatedlevel]

Spring中事務的定義:

Propagationkey屬性確定代理應該給哪個方法添加事務行為。這種屬性最重要的部份是傳播行為。)有下面選項可供使用:

  • PROPAGATION_REQUIRED--支持當前事務,假設當前沒有事務。就新建一個事務。

    這是最常見的選擇。

  • PROPAGATION_SUPPORTS--支持當前事務,假設當前沒有事務,就以非事務方式運行。
  • PROPAGATION_MANDATORY--支持當前事務,假設當前沒有事務,就拋出異常。 
  • PROPAGATION_REQUIRES_NEW--新建事務,假設當前存在事務。把當前事務掛起。 
  • PROPAGATION_NOT_SUPPORTED--以非事務方式運行操作。假設當前存在事務,就把當前事務掛起。

     

  • PROPAGATION_NEVER--以非事務方式運行,假設當前存在事務,則拋出異常。

舉例淺析Spring嵌套事務

ServiceA {
       
     void methodA() {
         ServiceB.methodB();
     }
  
}
  
ServiceB {
       
     void methodB() {
     }
       
}

  1. PROPAGATION_REQUIRED
    假如當前正要運行的事務不在另外一個事務里,那么就起一個新的事務
    比方說,ServiceB.methodB的事務級別定義為PROPAGATION_REQUIRED, 那么因為執行ServiceA.methodA的時候,ServiceA.methodA已經起了事務。這時調用ServiceB.methodB,ServiceB.methodB看到自己已經執行在ServiceA.methodA的事務內部。就不再起新的事務。而假如ServiceA.methodA執行的時候發現自己沒有在事務中,他就會為自己分配一個事務。這樣,在ServiceA.methodA或者在ServiceB.methodB內的不論什么地方出現異常。事務都會被回滾。即使ServiceB.methodB的事務已經被提交,可是ServiceA.methodA在接下來fail要回滾,ServiceB.methodB也要回滾

  2. PROPAGATION_SUPPORTS
    假設當前在事務中。即以事務的形式執行。假設當前不再一個事務中,那么就以非事務的形式執行
  3. PROPAGATION_MANDATORY
    必須在一個事務中執行。也就是說,他僅僅能被一個父事務調用。否則,他就要拋出異常
  4. PROPAGATION_REQUIRES_NEW
    這個就比較繞口了。 比方我們設計ServiceA.methodA的事務級別為PROPAGATION_REQUIRED,ServiceB.methodB的事務級別為PROPAGATION_REQUIRES_NEW。那么當運行到ServiceB.methodB的時候,ServiceA.methodA所在的事務就會掛起。ServiceB.methodB會起一個新的事務。等待ServiceB.methodB的事務完畢以后,他才繼續運行。

    他與PROPAGATION_REQUIRED 的事務差別在於事務的回滾程度了。由於ServiceB.methodB是新起一個事務,那么就是存在兩個不同的事務。假設ServiceB.methodB已經提交,那么ServiceA.methodA失敗回滾。ServiceB.methodB是不會回滾的。假設ServiceB.methodB失敗回滾,假設他拋出的異常被ServiceA.methodA捕獲,ServiceA.methodA事務仍然可能提交。



  5. PROPAGATION_NOT_SUPPORTED
    當前不支持事務。比方ServiceA.methodA的事務級別是PROPAGATION_REQUIRED 。而ServiceB.methodB的事務級別是PROPAGATION_NOT_SUPPORTED ,那么當執行到ServiceB.methodB時。ServiceA.methodA的事務掛起。而他以非事務的狀態執行完,再繼續ServiceA.methodA的事務。


  6. PROPAGATION_NEVER
    不能在事務中執行。

    如果ServiceA.methodA的事務級別是PROPAGATION_REQUIRED。 而ServiceB.methodB的事務級別是PROPAGATION_NEVER ,那么ServiceB.methodB就要拋出異常了。

  7. PROPAGATION_NESTED
    理解Nested的關鍵是savepoint。

    他與PROPAGATION_REQUIRES_NEW的差別是,PROPAGATION_REQUIRES_NEW另起一個事務。將會與他的父事務相互獨立。而Nested的事務和他的父事務是相依的,他的提交是要等和他的父事務一塊提交的。

    也就是說,假設父事務最后回滾。他也要回滾的。
    而Nested事務的優點是他有一個savepoint。




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM