1. 程式人生 > >spring 的事務問題,事務失效,事務傳播

spring 的事務問題,事務失效,事務傳播

1:同一個類,如下圖,我們調  service.methodA(),這時的話 methodA和 methodB都在 A定義的 事務內,只有在methodA 的方法裡throws  RuntimeException 時 才會回滾,methodA和methodB都會回滾。(注意:如果methodB丟擲RuntimeException,但是methodA中把這種異常捕獲,並讓程式正常執行,則都不會發生回滾。)

  1. Service {  
  2.      @Transactional  
  3.      void methodA() {  
  4.          methodB();  
  5.      }
  6.      void methodB(){
  7.      }
  8. }  

2:如下圖,我們調  service.methodA(),  methodB上面的事務是不生效(其他的幾個註解也不會生效)。可以簡單的這麼理解:spring 無法找到methodB 這個切面,無法收到事務通知。具體解釋見下面的部落格:http://blog.csdn.net/seelye/article/details/40144817

  1. Service {  
  2.      void methodA() {  
  3.          methodB();  
  4.      }
  5.      @Transactional
  6.      void methodB(){
  7.      }
  8. }  

3:正常的話,我們兩個方法都定義事務的話,就要把這兩個方法放在不同的service裡面。如下面:

可以把方法B放到另外一個service或者dao,然後把這個server或者dao通過@Autowired注入到方法A的bean裡面,這樣即使方法A沒用事務,方法B也可以執行自己的事務了。AOP就是這麼玩的!

  1. ServiceA {  
  2.      void methodA() {  
  3.          ServiceB.methodB();  
  4.      }  
  5. }  
  6. ServiceB {  
  7.      void methodB() {  
  8.      }  
  9. }  

4:

Spring中事務的定義:

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

  • PROPAGATION_REQUIRED--支援當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。
  • PROPAGATION_SUPPORTS--支援當前事務,如果當前沒有事務,就以非事務方式執行。
  • PROPAGATION_MANDATORY--支援當前事務,如果當前沒有事務,就丟擲異常。 
  • PROPAGATION_REQUIRES_NEW--新建事務,如果當前存在事務,把當前事務掛起。 
  • PROPAGATION_NOT_SUPPORTED--以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。 
  • PROPAGATION_NEVER--以非事務方式執行,如果當前存在事務,則丟擲異常。