spring 事物 @Transactional 詳解

前言

spring 事物管理默認配置下若是,service中try{}catch{}中發生了異常,事物是不會回滾的。spring

緣由

Spring默認狀況下會對運行期捕獲到的RunTimeException進行事務回滾。數據庫

例如性能

if(user){          
    try {         
        userDao.save(user);           
     } catch (Exception e) {          
        
     }         
 }

解決方法

方法1

在catch中拋出運行時異常供spring捕獲spa

if(user){          
    try {         
        userDao.save(user);           
     } catch (Exception e) {          
        throw new RuntimeException();      
     }         
 }

方法2

在catch中手動回滾事物,如今在用.net

if(user){          
    try {         
        userDao.save(user);           
     } catch (Exception e) {          
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();     
     }         
 }

https://my.oschina.net/u/3714931/blog/1580753code

方法3

配置@Transactional的參數blog

@Transactional(rollbackFor=Exception.class)

propagation:事務傳播性設置,Propagation枚舉類型。Spring支持的事務傳播屬性包括7種:事務

PROPAGATION_MANDATORY:方法必須在事務中執行,不然拋出異常。

    PROPAGATION_NESTED:使方法運行在嵌套事務中,不然和PROPAGATION_REQUIRED同樣。

    PROPAGATION_NEVER :當前方法永遠不在事務中運行,不然拋出異常。

    PROPAGATION_NOT_SUPPORTED:定義爲當前事務不支持的方法,在該方法執行期間正在運行的事務會被暫停

    PROPAGATION_REQUIRED:當前的方法必須運行在事務中,若是沒有事務就新建一個事務。新事務和方法一塊兒開始,隨着方法返回或者拋出異常時終止。

    PROPAGATION_REQUIRED_NEW :當前方法必須新建一個事務,若是當前的事務正在運行則暫停。

    PROPAGATION_SUPPORTS :規定當前方法支持當前事務,可是若是沒有事務在運行就使用非事務方法執行。

isolation:事務隔離性級別設置,Isolation枚舉類型get

ISOLATION_DEFAULT :使用數據庫默認的隔離級別

    ISOLATION_COMMITTED:容許其餘事務已經提交的更新(防止髒讀取)

    ISOLATION_READ_UNCOMMITTED:容許讀取其餘事務未提交的更新,會致使三個缺陷發生。執行速度最快

    ISOLATION_REPEATABLE_READ :除非事務自身更改了數據,不然事務屢次讀取的數據相同(防止髒數據,屢次重複讀取)

    ISOLATION_SERIALIZABLE:隔離級別最高,能夠防止三個缺陷,可是速度最慢,影響性能。

readOnly:讀寫性事務,只讀性事務,布爾型io

timeout:超時時間,單位秒

rollbackFor:一組異常類的實例,遇到時必須進行回滾

rollbackForClassname:一組異常類的名字,遇到時必須進行回滾

noRollbackFor:一組異常類的實例,遇到時必須不回滾

noRollbackForClassname:一組異常類的名字,遇到時必須不回滾

相關文章
相關標籤/搜索