Java @Transactional指定回滾條件

異常分類

  • 可查的異常(checked exceptions):Exception下除瞭RuntimeException外的異常
  • 不可查的異常(unchecked exceptions):RuntimeException及其子類和錯誤(Error)

@Transactional註解屬性詳解

屬性 類型 描述
value String 可選的限定描述符,指定使用的事務管理器
propagation enum: Propagation 可選的事務傳播行為設置
isolation enum: Isolation 可選的事務隔離級別設置
readOnly boolean 讀寫或隻讀事務,默認讀寫
timeout int (in seconds granularity) 事務超時時間設置
rollbackFor Class對象數組,必須繼承自Throwable 導致事務回滾的異常類數組
rollbackForClassName 類名數組,必須繼承自Throwable 導致事務回滾的異常類名字數組
noRollbackFor Class對象數組,必須繼承自Throwable 不會導致事務回滾的異常類數組
noRollbackForClassName 類名數組,必須繼承自Throwable 不會導致事務回滾的異常類名字數

@Transactional

使用@Transaction註解時,阿裡巴巴代碼規范插件會提醒需要指定rollbackFor以顯示的rollback

默認情況下,Spring框架在使用@Transaction處理事務時默認隻在拋出運行時異常unchecked exceptions時才會事務回滾。也就是說,當拋出個RuntimeException 或其子類例的實例時,從事務方法中拋出的Checked exceptions將不被標識進行事務回滾。

  • 讓checked異常回滾:在整個方法前加上 @Transactional(rollbackOn=Exception.class)
  • 讓unchecked異常不回滾: @Transactional(dontRollbackOn=RunTimeException.class)
  • 不需要事務管理的(隻查詢的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)

註意

  • 如果異常被try-catch瞭,事務就不會回滾,如果想讓事務回滾必須再往外拋try{}catch{throw Exception}
  • Spring團隊的建議在具體的類(或類的方法)上使用 @Transactional 註解,而不要使用在類所要實現的任何接口上。也可以在接口上使用 @Transactional 註解,但是這種情況需要設置基於接口的代理時才生效
  • @Transactional 註解標識的方法,建議處理過程盡量的簡單。尤其是帶鎖的事務方法,能不放在事務裡面的最好不要放在事務裡面。可以將常規的數據庫查詢操作放在事務前面進行,而將增、刪、改等操作放在事務中

代碼

@Slf4j
@Service
public class MemberService {

    @Autowired
    private MemberMapper memberMapper;

    @Transactional
    public Integer insert(MemberEntity memberEntity) {
        Integer insertResult = 0;
        try {
            insertResult = memberMapper.save(memberEntity);
            log.info("insertResult:{}", insertResult);
            int result = 1 / memberEntity.getAge();
        } catch (Exception e) {
            log.error("errorMsg:{}", e.getMessage());
            //回滾
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
        return insertResult;
    }
}

如上標紅代碼,如果不寫的話,事務是不會回滾的。因為事務被 catch 捕獲到瞭,所以隻能手動的進行事務回滾。

到此這篇關於Java @Transactional指定回滾條件的文章就介紹到這瞭,更多相關Java @Transactional內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: