偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

99% 的人都忽略了這些!@Transactional 在 SpringBoot 中的六大風(fēng)險(xiǎn)用法

開發(fā) 前端
事務(wù)是一把“雙刃劍”,使用得當(dāng),它讓數(shù)據(jù)一致性問題迎刃而解;使用不當(dāng),則可能掀起連鎖災(zāi)難。@Transactional 并非魔法注解,而是對(duì) Spring AOP、數(shù)據(jù)庫(kù)連接管理、異常傳播機(jī)制的深度協(xié)同。

在日常開發(fā)中,Spring 的 @Transactional 被廣泛用于簡(jiǎn)化數(shù)據(jù)庫(kù)事務(wù)管理。然而,當(dāng)代碼量不斷增長(zhǎng)、系統(tǒng)復(fù)雜度上升時(shí),許多開發(fā)者并未真正理解它的運(yùn)行機(jī)制和邊界條件。這種模糊的認(rèn)知,往往是引發(fā)生產(chǎn)事故的根源。

本文將基于真實(shí)項(xiàng)目經(jīng)驗(yàn),系統(tǒng)性地拆解 6 個(gè)最常見的事務(wù)“反模式”及其正確打開方式,同時(shí)配以 Java 示例代碼、底層原理解析與實(shí)戰(zhàn)規(guī)避建議,確保你能將 @Transactional 運(yùn)用得心應(yīng)手。

1.問題描述:異常捕獲不當(dāng)導(dǎo)致事務(wù)回滾失效

@Transactional
public void processOrder(Order order) {
    try {
        orderDao.save(order);
        inventoryService.deduct(order.getItems()); // RuntimeException 可能拋出
    } catch (Exception e) {
        log.error("處理訂單失敗", e); // 被 try-catch 吞掉后事務(wù)不會(huì)自動(dòng)回滾
    }
}

正確做法

方案一:重新拋出異常

catch (Exception e) {
    throw new BusinessException("下單失敗", e); // 自定義異常需配合 rollbackFor 使用
}

方案二:手動(dòng)標(biāo)記回滾

catch (Exception e) {
    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}

提示:事務(wù)回滾依賴于異常傳播,若異常被吞,Spring 無法感知異常,自然不會(huì)回滾。

2.問題描述:非 public 方法事務(wù)根本無效!

@Transactional
private void updateUser(User user) {
    userDao.update(user); // 事務(wù)不會(huì)起作用
}

原因解析

Spring AOP 默認(rèn)基于代理實(shí)現(xiàn)事務(wù)攔截,僅對(duì) public 方法有效。

檢查方法

assertThat(AopUtils.isAopProxy(userService)).isTrue();

注意:即使標(biāo)注了 @Transactional,非 public 方法仍會(huì)被 Spring 忽略!

3.問題描述:類內(nèi)部方法調(diào)用,事務(wù)注解形同虛設(shè)!

public class OrderService {


    public void createOrder(Order order) {
        validate(order);
        this.saveOrder(order); // 自調(diào)用不觸發(fā)事務(wù)增強(qiáng)邏輯
    }


    @Transactional
    public void saveOrder(Order order) {
        orderDao.save(order);
    }
}

可選解決方案

方案

優(yōu)點(diǎn)

缺點(diǎn)

注入自身代理

修改最小

存在循環(huán)依賴風(fēng)險(xiǎn)

拆分為獨(dú)立 Service

清晰職責(zé)分離

增加類數(shù)量

使用編程式事務(wù)控制

靈活控制

代碼入侵性強(qiáng)

代理調(diào)用示例:

@Autowired
private OrderService orderServiceProxy;


orderServiceProxy.saveOrder(order);

4.問題描述:事務(wù)傳播行為混亂引發(fā)“預(yù)期之外”的提交

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void logOperation(Log log) {
    logDao.save(log); // 會(huì)新建事務(wù)
}


public void updateUser(User user) {
    userDao.update(user);
    logOperation(new Log("update")); // 即使這里失敗,日志仍可能已提交
}

各傳播行為簡(jiǎn)析:

類型

特性

常見用途

REQUIRED

有事務(wù)則加入,無則新建

默認(rèn),適用于絕大多數(shù)業(yè)務(wù)

REQUIRES_NEW

掛起當(dāng)前事務(wù),新建新事務(wù)

審計(jì)日志、補(bǔ)償邏輯

NESTED

創(chuàng)建保存點(diǎn)支持局部回滾

復(fù)雜流程中部分失敗容忍

MANDATORY

要求必須已有事務(wù)

安全控制

提醒:跨服務(wù)事務(wù)傳播要特別小心 REQUIRES_NEW,避免出現(xiàn)部分提交行為。

5.問題描述:事務(wù)超時(shí)未生效或設(shè)置不合理

@Transactional(timeout = 3) // 單位:秒
public void batchProcess() {
    // 長(zhǎng)時(shí)間的數(shù)據(jù)庫(kù)操作
}

常見失效場(chǎng)景:

  • 操作命中一級(jí)緩存,未真正訪問數(shù)據(jù)庫(kù)
  • 包含耗時(shí)但非數(shù)據(jù)庫(kù)操作(IO、網(wǎng)絡(luò))
  • 嵌套事務(wù)以外層事務(wù)超時(shí)為準(zhǔn)

推薦:統(tǒng)一設(shè)置超時(shí) spring.transaction.default-timeout,并手動(dòng)檢測(cè)大事務(wù)邏輯。

6.問題描述:連接池耗盡導(dǎo)致死鎖

@Transactional
public void methodA() {
    serviceB.methodB(); // 如果 methodB 是 REQUIRES_NEW,可能會(huì)阻塞等待新連接
}


@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
    // 操作數(shù)據(jù)庫(kù)
}

死鎖發(fā)生條件:

  1. methodA 已獲取連接(池中剩余 N-1)
  2. methodB 想再拿一個(gè)連接(池已空)
  3. methodA 等待 methodB 完成,methodB 在阻塞

解決思路:

  • 避免 REQUIRES_NEW 濫用,除非絕對(duì)必要
  • 增大連接池容量(并非根本解)
  • 使用 @Async 或消息隊(duì)列異步拆分操作

配置建議(application.yml)

spring:
  transaction:
    default-timeout: 30
    rollback-on-commit-failure: true

指標(biāo)監(jiān)控

@Bean
public TransactionMetrics transactionMetrics(PlatformTransactionManager tm) {
    return new TransactionMetrics(tm);
}
// 暴露至 /actuator/metrics/transaction.* 查看

事務(wù)行為測(cè)試校驗(yàn)

@SpringBootTest
class TransactionTest {


    @Autowired
    DataSource dataSource;


    @Test
    void testTransaction() {
        assertThat(dataSource).isInstanceOf(DataSourceProxy.class);
        // 其他驗(yàn)證邏輯
    }
}

寫在最后

事務(wù)是一把“雙刃劍”,使用得當(dāng),它讓數(shù)據(jù)一致性問題迎刃而解;使用不當(dāng),則可能掀起連鎖災(zāi)難。@Transactional 并非魔法注解,而是對(duì) Spring AOP、數(shù)據(jù)庫(kù)連接管理、異常傳播機(jī)制的深度協(xié)同。

我們?cè)陂_發(fā)中,應(yīng)充分掌握事務(wù)的邊界條件、潛在陷阱與最佳實(shí)踐,才是真正構(gòu)建健壯系統(tǒng)的根基。

責(zé)任編輯:武曉燕 來源: 路條編程
相關(guān)推薦

2023-07-24 11:01:32

2025-10-22 08:55:16

2022-05-16 09:18:47

物聯(lián)網(wǎng)物聯(lián)網(wǎng)安全

2020-11-11 14:23:35

網(wǎng)絡(luò)安全數(shù)據(jù)泄露網(wǎng)絡(luò)攻擊

2025-09-08 05:00:00

數(shù)據(jù)中心服務(wù)器數(shù)據(jù)中心選址

2023-05-04 09:09:32

IT技術(shù)人工智能

2023-07-05 10:43:45

IT風(fēng)險(xiǎn)能力

2018-06-06 14:15:12

2016-08-24 15:39:46

ownCloud存儲(chǔ)服務(wù)器

2025-07-10 07:00:00

CIO數(shù)據(jù)管理IT領(lǐng)導(dǎo)者

2013-07-01 09:46:06

風(fēng)險(xiǎn)管理安全風(fēng)險(xiǎn)管理

2018-01-30 10:44:43

區(qū)塊鏈投資數(shù)字貨幣

2023-01-13 12:39:27

5G技術(shù)安全

2024-08-12 16:21:18

2022-11-24 11:20:12

2022-10-20 07:47:46

2013-07-30 12:49:20

2025-09-02 07:39:16

2019-05-15 16:15:08

HTTPGETPOST

2016-09-23 15:10:10

HTTPGETPOST
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)