首頁 >Java >java教程 >怎麼使用Java @Transactional指定回滾條件

怎麼使用Java @Transactional指定回滾條件

WBOY
WBOY轉載
2023-04-20 10:04:111417瀏覽

異常分類

怎麼使用Java @Transactional指定回滾條件

  • 可查的例外(checked exceptions):Exception下除了RuntimeException外的異常

  • #不可查的例外(unchecked exceptions):RuntimeException及其子類別與錯誤(Error)

@Transactional註解屬性詳解

##可選的限定描述符,指定使用的交易管理器propagationenum: Propagation可選的交易傳播行為設定#isolationenum: Isolation可選的交易隔離等級設定readOnlyboolean讀寫或只讀事務,預設讀寫timeoutint (in seconds granularity)交易逾時時間設定rollbackForClass物件數組,必須繼承自Throwable導致交易回滾的例外類別數組rollbackForClassName類別名稱數組,必須繼承自Throwable導致交易回滾的例外類別名字數組noRollbackForClass物件數組,必須繼承自Throwable不會導致事務回滾的異常類別數組noRollbackForClassName類別名稱數組,必須繼承自Throwable不會導致事務回滾的異常類別名字數
#屬性 類型 描述
value String
#@Transactional

使用@Transaction註解時,阿里巴巴程式碼規範外掛程式會提醒需要指定rollbackFor以顯示的rollback

怎麼使用Java @Transactional指定回滾條件

#預設情況下,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指定回滾條件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除