最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot 編程式事務使用及兩種實現(xiàn)方式

 更新時間:2024年12月20日 09:38:56   作者:lzz的編碼時刻  
編程式事務管理是通過編寫代碼來管理事務,相對于聲明式事務(@Transactional注解),它提供了更細粒度的事務控制,這篇文章主要介紹了SpringBoot 編程式事務使用及兩種實現(xiàn)方式,需要的朋友可以參考下

1. 簡介

編程式事務管理是通過編寫代碼來管理事務,相對于聲明式事務(@Transactional注解),它提供了更細粒度的事務控制。在 SpringBoot 中,主要有兩種實現(xiàn)方式:

  • 使用 TransactionTemplate
  • 直接使用 TransactionManager

2. TransactionTemplate 方式

TransactionTemplate 是最簡單的編程式事務實現(xiàn)方式,它對底層事務 API 進行了封裝,使用起來更加便捷。

2.1 基本配置

@Configuration
public class TransactionConfig {
    @Autowired
    private PlatformTransactionManager transactionManager;
    @Bean
    public TransactionTemplate transactionTemplate() {
        TransactionTemplate template = new TransactionTemplate();
        template.setTransactionManager(transactionManager);
        // 設置默認的事務傳播行為
        template.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        // 設置默認的事務隔離級別
        template.setIsolationLevel(TransactionDefinition.ISOLATION_DEFAULT);
        // 設置默認超時時間
        template.setTimeout(30);
        return template;
    }
}

2.2 基本使用示例

@Service
@Slf4j
public class UserService {
    @Autowired
    private TransactionTemplate transactionTemplate;
    @Autowired
    private UserRepository userRepository;
    public User createUser(User user) {
        // 使用 execute 方法執(zhí)行有返回值的事務操作
        return transactionTemplate.execute(status -> {
            try {
                User savedUser = userRepository.save(user);
                // 模擬其他操作
                updateUserProfile(savedUser);
                return savedUser;
            } catch (Exception e) {
                // 手動標記事務回滾
                status.setRollbackOnly();
                log.error("創(chuàng)建用戶失敗", e);
                throw new RuntimeException("創(chuàng)建用戶失敗", e);
            }
        });
    }
    public void batchCreateUsers(List<User> users) {
        // 使用 executeWithoutResult 方法執(zhí)行無返回值的事務操作
        transactionTemplate.executeWithoutResult(status -> {
            try {
                for (User user : users) {
                    userRepository.save(user);
                }
            } catch (Exception e) {
                status.setRollbackOnly();
                log.error("批量創(chuàng)建用戶失敗", e);
                throw new RuntimeException("批量創(chuàng)建用戶失敗", e);
            }
        });
    }
}

3. TransactionManager 方式

直接使用 TransactionManager 提供了更細粒度的事務控制,但使用起來相對復雜。

3.1 基本使用示例

@Service
@Slf4j
public class OrderService {
    @Autowired
    private PlatformTransactionManager transactionManager;
    @Autowired
    private OrderRepository orderRepository;
    public Order createOrder(Order order) {
        // 定義事務屬性
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
        def.setTimeout(30);
        // 獲取事務狀態(tài)
        TransactionStatus status = transactionManager.getTransaction(def);
        try {
            // 執(zhí)行業(yè)務邏輯
            Order savedOrder = orderRepository.save(order);
            // 處理訂單相關的其他操作
            processOrderDetails(savedOrder);
            // 提交事務
            transactionManager.commit(status);
            return savedOrder;
        } catch (Exception e) {
            // 回滾事務
            transactionManager.rollback(status);
            log.error("創(chuàng)建訂單失敗", e);
            throw new RuntimeException("創(chuàng)建訂單失敗", e);
        }
    }
}

3.2 嵌套事務示例

@Service
@Slf4j
public class PaymentService {
    @Autowired
    private PlatformTransactionManager transactionManager;
    @Autowired
    private PaymentRepository paymentRepository;
    public void processPayment(Payment payment) {
        // 外部事務定義
        DefaultTransactionDefinition outerDef = new DefaultTransactionDefinition();
        outerDef.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        TransactionStatus outerStatus = transactionManager.getTransaction(outerDef);
        try {
            // 外部事務操作
            paymentRepository.save(payment);
            // 內部事務定義
            DefaultTransactionDefinition innerDef = new DefaultTransactionDefinition();
            innerDef.setPropagationBehavior(TransactionDefinition.PROPAGATION_NESTED);
            TransactionStatus innerStatus = transactionManager.getTransaction(innerDef);
            try {
                // 執(zhí)行內部事務操作
                processPaymentDetails(payment);
                transactionManager.commit(innerStatus);
            } catch (Exception e) {
                // 回滾內部事務
                transactionManager.rollback(innerStatus);
                log.error("支付詳情處理失敗", e);
                throw e;
            }
            // 提交外部事務
            transactionManager.commit(outerStatus);
        } catch (Exception e) {
            // 回滾外部事務
            transactionManager.rollback(outerStatus);
            log.error("支付處理失敗", e);
            throw new RuntimeException("支付處理失敗", e);
        }
    }
}

4. 事務傳播行為

在編程式事務中,我們可以精確控制事務的傳播行為:

@Service
public class TransactionPropagationExample {
    @Autowired
    private TransactionTemplate transactionTemplate;
    public void demonstratePropagation() {
        // REQUIRED 傳播行為
        TransactionTemplate requiredTemplate = new TransactionTemplate(transactionTemplate);
        requiredTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        // REQUIRES_NEW 傳播行為
        TransactionTemplate requiresNewTemplate = new TransactionTemplate(transactionTemplate);
        requiresNewTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
        // 嵌套使用不同的傳播行為
        requiredTemplate.execute(outerStatus -> {
            // 外部事務邏輯
            requiresNewTemplate.execute(innerStatus -> {
                // 內部事務邏輯(新的事務)
                return null;
            });
            return null;
        });
    }
}

5. 事務隔離級別

示例展示如何設置不同的事務隔離級別:

@Service
public class TransactionIsolationExample {
    @Autowired
    private PlatformTransactionManager transactionManager;
    public void demonstrateIsolation() {
        // 讀已提交隔離級別
        DefaultTransactionDefinition readCommittedDef = new DefaultTransactionDefinition();
        readCommittedDef.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
        TransactionStatus readCommittedStatus = transactionManager.getTransaction(readCommittedDef);
        try {
            // 業(yè)務邏輯
            transactionManager.commit(readCommittedStatus);
        } catch (Exception e) {
            transactionManager.rollback(readCommittedStatus);
            throw e;
        }
        // 可重復讀隔離級別
        DefaultTransactionDefinition repeatableReadDef = new DefaultTransactionDefinition();
        repeatableReadDef.setIsolationLevel(TransactionDefinition.ISOLATION_REPEATABLE_READ);
        // ... 類似的事務處理邏輯
    }
}

6. 最佳實踐

6.1 事務模板封裝

創(chuàng)建一個通用的事務處理模板:

@Component
@Slf4j
public class TransactionHelper {
    @Autowired
    private TransactionTemplate transactionTemplate;
    public <T> T executeInTransaction(TransactionCallback<T> action) {
        try {
            return transactionTemplate.execute(action);
        } catch (Exception e) {
            log.error("事務執(zhí)行失敗", e);
            throw new RuntimeException("事務執(zhí)行失敗", e);
        }
    }
    public void executeInTransactionWithoutResult(Consumer<TransactionStatus> action) {
        try {
            transactionTemplate.executeWithoutResult(action);
        } catch (Exception e) {
            log.error("事務執(zhí)行失敗", e);
            throw new RuntimeException("事務執(zhí)行失敗", e);
        }
    }
}
// 使用示例
@Service
public class BusinessService {
    @Autowired
    private TransactionHelper transactionHelper;
    public void doBusiness() {
        transactionHelper.executeInTransactionWithoutResult(status -> {
            // 業(yè)務邏輯
        });
    }
}

7. 常見問題與解決方案

7.1 事務超時處理

@Service
public class TimeoutExample {
    @Autowired
    private TransactionTemplate transactionTemplate;
    public void handleTimeout() {
        TransactionTemplate timeoutTemplate = new TransactionTemplate(transactionTemplate);
        timeoutTemplate.setTimeout(5); // 設置5秒超時
        try {
            timeoutTemplate.execute(status -> {
                // 可能超時的業(yè)務邏輯
                return null;
            });
        } catch (TransactionTimedOutException e) {
            // 處理超時異常
            log.error("事務執(zhí)行超時", e);
            throw new RuntimeException("事務執(zhí)行超時", e);
        }
    }
}

7.2 異常處理最佳實踐

@Service
public class ExceptionHandlingExample {
    @Autowired
    private TransactionTemplate transactionTemplate;
    public void handleExceptions() {
        try {
            transactionTemplate.execute(status -> {
                try {
                    // 業(yè)務邏輯
                    return null;
                } catch (BusinessException e) {
                    // 業(yè)務異常,標記回滾
                    status.setRollbackOnly();
                    throw e;
                } catch (Exception e) {
                    // 其他異常,標記回滾
                    status.setRollbackOnly();
                    throw new RuntimeException("未預期的錯誤", e);
                }
            });
        } catch (Exception e) {
            // 統(tǒng)一異常處理
            handleException(e);
        }
    }
    private void handleException(Exception e) {
        if (e instanceof BusinessException) {
            // 處理業(yè)務異常
            log.warn("業(yè)務異常: {}", e.getMessage());
        } else {
            // 處理系統(tǒng)異常
            log.error("系統(tǒng)異常", e);
        }
        throw e;
    }
}

雖然編程式事務提供了更細粒度的控制,但在大多數(shù)情況下,聲明式事務(@Transactional)可能是更好的選擇。只有在需要特別精細的事務控制時,才考慮使用編程式事務。

到此這篇關于SpringBoot 編程式事務使用的文章就介紹到這了,更多相關SpringBoot 編程式事務內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • JAVA 根據(jù)設置的概率生成隨機數(shù)的方法

    JAVA 根據(jù)設置的概率生成隨機數(shù)的方法

    本篇文章主要介紹了JAVA 根據(jù)設置的概率生成隨機數(shù)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • java基于odbc連接oracle的實現(xiàn)方法

    java基于odbc連接oracle的實現(xiàn)方法

    這篇文章主要介紹了java基于odbc連接oracle的實現(xiàn)方法,結合實例形式分析了連接操作的具體步驟與相關實現(xiàn)技巧,需要的朋友可以參考下
    2016-09-09
  • java項目idea構建總是報內存溢出怎么解決詳析

    java項目idea構建總是報內存溢出怎么解決詳析

    這篇文章主要介紹了java項目idea構建總是報內存溢出怎么解決的相關資料,方法包括增加IDEA內存分配、調整項目編譯設置、配置Gradle構建內存、優(yōu)化項目結構、清理不必要的依賴、使用命令行構建、更新IDEA和JDK、清理IDEA緩存和禁用不必要的插件,需要的朋友可以參考下
    2025-03-03
  • 計算一個Java對象占用字節(jié)數(shù)的方法

    計算一個Java對象占用字節(jié)數(shù)的方法

    這篇文章主要介紹了計算一個Java對象占用字節(jié)數(shù)的方法,較為詳細的分析了Java中各類對象所占用的字節(jié)數(shù),需要的朋友可以參考下
    2015-01-01
  • Java語言實現(xiàn)簡單FTP軟件 FTP軟件本地窗口實現(xiàn)(5)

    Java語言實現(xiàn)簡單FTP軟件 FTP軟件本地窗口實現(xiàn)(5)

    這篇文章主要為大家詳細介紹了Java語言實現(xiàn)簡單FTP軟件,F(xiàn)TP軟件本地窗口的實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Spring實現(xiàn)動態(tài)數(shù)據(jù)源切換的方法總結

    Spring實現(xiàn)動態(tài)數(shù)據(jù)源切換的方法總結

    這篇文章主要為大家詳細介紹了一種Spring實現(xiàn)動態(tài)數(shù)據(jù)源切換的方法,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-06-06
  • Spring?MVC請求轉發(fā)與請求重定向的示例詳解

    Spring?MVC請求轉發(fā)與請求重定向的示例詳解

    轉發(fā)指服務器接收請求后,從一個資源跳轉到另一個資源中,請求轉發(fā)是一次請求,不會改變?yōu)g覽器的請求地址,這篇文章主要介紹了Spring?MVC請求轉發(fā)與請求重定向的相關知識,需要的朋友可以參考下
    2023-09-09
  • Java中構造器內部的多態(tài)方法的行為實例分析

    Java中構造器內部的多態(tài)方法的行為實例分析

    這篇文章主要介紹了Java中構造器內部的多態(tài)方法的行為,結合實例形式分析了java構造器內部多態(tài)方法相關原理、功能及操作技巧,需要的朋友可以參考下
    2019-10-10
  • 詳解java_ 集合綜合案例:斗地主

    詳解java_ 集合綜合案例:斗地主

    這篇文章主要介紹了java_ 集合綜合案例:斗地主,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • SpringBoot公共字段自動填充實現(xiàn)與避坑指南

    SpringBoot公共字段自動填充實現(xiàn)與避坑指南

    在開發(fā)外賣系統(tǒng)訂單模塊時,我發(fā)現(xiàn)每個實體類都包含create_time、update_by等重復字段,手動維護這些字段不僅效率低下,還容易出錯,本文將分享一套經(jīng)過生產(chǎn)驗證的自動化方案,助你徹底擺脫公共字段維護的煩惱,需要的朋友可以參考下
    2025-05-05

最新評論

肃南| 马公市| 中西区| 昌乐县| 彭阳县| 彰化市| 白银市| 乌审旗| 宜丰县| 新野县| 同心县| 萝北县| 邳州市| 科技| 彭州市| 威海市| 阿合奇县| 尤溪县| 运城市| 昌平区| 射洪县| 乐陵市| 文山县| 北安市| 尉氏县| 米林县| 盐山县| 榆树市| 郴州市| 曲松县| 柯坪县| 平山县| 临江市| 陆川县| 革吉县| 惠东县| 绵阳市| 屏边| 西盟| 拉萨市| 普陀区|