欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Spring事務(wù)回滾的兩種方法

 更新時(shí)間:2023年07月25日 09:48:56   作者:阿桿  
Spring事務(wù)回滾的前提是你當(dāng)前使用的數(shù)據(jù)庫(kù)必須支持事務(wù),比如MySQL的Innodb是支持的,但Mysaim則是不支持事務(wù)的,本文就給大家介紹兩種Spring事務(wù)回滾的方法,需要的朋友可以參考下

方法一

  • 使用 @Transaction 來(lái)配置自動(dòng)回滾,可以配置在類上,也可以配置在方法上(作用域不同),但對(duì)final或private修飾的方法無(wú)效,且該類必須是受spring所管控的,也就是被已經(jīng)被注入的類,而不是new出來(lái)的類。

    • 若配置在方法上,則該方法被加上了事務(wù)
    • 若配置在類上,則等于給該類的所有方法都加上了該注解。此時(shí)如果在該類下的某個(gè)方法也加了 @Transaction ,則該方法使用自己的配置,其他方法使用類上的配置。
@Service
@Transactional
public class UserServiceImpl implements UserService {
    @Override
    public void save(User user) {
        //some code
        //db operation
    }
}
  • 若被配置的方法或類拋出了異常,則事務(wù)會(huì)被自動(dòng)回滾,除非你在該方法中手動(dòng)捕獲了異常,且沒有拋出新的異常。
  • 可以使用 @Transactional(rollbackFor = Exception.class) 來(lái)設(shè)定針對(duì)特定的異常進(jìn)行事務(wù)回滾,如果不設(shè)置則默認(rèn)會(huì)回滾 RuntimeException and Error (參考自源碼內(nèi)文檔)。
@Service
@Transactional(rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {
    @Resource
	private UserMapper userMapper;
    @Override
    public void save(User user) {
        userMapper.insert(user);
        throw new RuntimeException(); // 拋出異常,事務(wù)回滾,上面的insert插入失敗。
    }
}

方法二

通過注入 DataSourceTransactionManager 來(lái)手動(dòng)開啟事務(wù),手動(dòng)回滾事務(wù),用于拋出異常被catch后,進(jìn)行手動(dòng)回滾,可控程度更高,可以更靈活的使用。

  • 先注入 DataSourceTransactionManager 事務(wù)管理對(duì)象
  • new 一個(gè) DefaultTransactionDefinition def = new DefaultTransactionDefinition(); 對(duì)象
  • 使用 TransactionStatus status = transactionManager.getTransaction(def);來(lái)開啟一個(gè)事務(wù),
  • 使用 transactionManager.rollback(status); 來(lái)回滾這個(gè)事務(wù)
  • 使用 transactionManager.commit(status); 來(lái)提交這個(gè)事務(wù)
@Service
public class UserServiceImpl implements UserService {
   @Autowired
   private DataSourceTransactionManager transactionManager;
   @Override
   @Transactional
   public void save(User user) {
       DefaultTransactionDefinition def = new DefaultTransactionDefinition();
       // explicitly setting the transaction name is something that can only be done programmatically
       def.setName("SomeTxName");
       def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
       TransactionStatus status = transactionManager.getTransaction(def);
       try {
           // execute your business logic here
           //db operation
       } catch (Exception ex) {
           transactionManager.rollback(status);
           throw ex;
       }
   }
} // 此代碼案例來(lái)自Alibaba Coding Guidelines

到此這篇關(guān)于詳解Spring事務(wù)回滾的兩種方法的文章就介紹到這了,更多相關(guān)Spring事務(wù)回滾內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Security 強(qiáng)制退出指定用戶的方法

    Spring Security 強(qiáng)制退出指定用戶的方法

    本篇文章主要介紹了Spring Security 強(qiáng)制退出指定用戶的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2018-03-03
  • 六個(gè)Java集合使用時(shí)需要注意的事項(xiàng)

    六個(gè)Java集合使用時(shí)需要注意的事項(xiàng)

    這篇文章主要為大家詳細(xì)介紹了六個(gè)Java集合使用時(shí)需要注意的事項(xiàng),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)java有一定的幫助,需要的可以參考一下
    2023-01-01
  • 如何在Java中創(chuàng)建線程通信的四種方式你知道嗎

    如何在Java中創(chuàng)建線程通信的四種方式你知道嗎

    開發(fā)中不免會(huì)遇到需要所有子線程執(zhí)行完畢通知主線程處理某些邏輯的場(chǎng)景?;蛘呤蔷€程 A 在執(zhí)行到某個(gè)條件通知線程 B 執(zhí)行某個(gè)操作。下面我們來(lái)一起學(xué)習(xí)如何解決吧
    2021-09-09
  • WebSocket整合SSM(Spring,Struts2,Maven)的實(shí)現(xiàn)示例

    WebSocket整合SSM(Spring,Struts2,Maven)的實(shí)現(xiàn)示例

    這篇文章主要介紹了WebSocket整合SSM(Spring,Struts2,Maven)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • Java實(shí)現(xiàn)用戶管理系統(tǒng)

    Java實(shí)現(xiàn)用戶管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)用戶管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • idea 離線安裝lombok插件的方法步驟(圖文)

    idea 離線安裝lombok插件的方法步驟(圖文)

    這篇文章主要介紹了idea 離線安裝lombok插件的方法步驟(圖文),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2019-01-01
  • SpringBoot使用MockMvc測(cè)試get和post接口的示例代碼

    SpringBoot使用MockMvc測(cè)試get和post接口的示例代碼

    Spring Boot MockMvc是一個(gè)用于單元測(cè)試的模塊,它是Spring框架的一部分,專注于簡(jiǎn)化Web應(yīng)用程序的測(cè)試,MockMvc主要用來(lái)模擬一個(gè)完整的HTTP請(qǐng)求-響應(yīng)生命周期,本文給大家介紹了SpringBoot使用MockMvc測(cè)試get和post接口,需要的朋友可以參考下
    2024-06-06
  • JAVA流控及超流控后的延遲處理實(shí)例

    JAVA流控及超流控后的延遲處理實(shí)例

    這篇文章主要介紹了JAVA流控及超流控后的延遲處理,以實(shí)例形式較為詳細(xì)的分析了Java進(jìn)行流量控制的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2014-12-12
  • Java由淺入深講解繼承上

    Java由淺入深講解繼承上

    繼承就是可以直接使用前輩的屬性和方法。自然界如果沒有繼承,那一切都是處于混沌狀態(tài)。多態(tài)是同一個(gè)行為具有多個(gè)不同表現(xiàn)形式或形態(tài)的能力。多態(tài)就是同一個(gè)接口,使用不同的實(shí)例而執(zhí)行不同操作
    2022-04-04
  • Java通過stmp協(xié)議發(fā)送郵件

    Java通過stmp協(xié)議發(fā)送郵件

    這篇文章主要為大家詳細(xì)介紹了Java通過stmp協(xié)議發(fā)送郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02

最新評(píng)論