首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

工作中常見錯誤記錄:異步消息處理與事務回滾陷阱

     編輯:Java 綜合教學

工作中常見錯誤記錄:異步消息處理與事務回滾陷阱

案例一:發送消息異常不應阻塞主流程

問題

主程序同步調用發送消息接口,接口異常導致主流程回滾/失敗。

解決方案對比

方案做法優點缺點
MQ 異步主流程發送 MQ,消費者異步處理完全解耦,高可用引入中間件,複雜度上升
接口內部捕獲發送接口 try-catch 吞掉異常改動小,無額外組件異常丟失,難追蹤

採用 Spring AOP 統一處理(方案二增強版)

@Aspect
@Component
public class SendMessageAspect {
    @Around("execution(* com.xxx.service.MessageSender.*(..))")
    public Object handleException(ProceedingJoinPoint pjp) {
        try {
            return pjp.proceed();
        } catch (Exception e) {
            log.error("發送消息失敗", e);
            return null; // 或默認返回值,不拋出
        }
    }
}

關鍵配置點

  • <context:component-scan> 預設不掃描 @Aspect,需加 @Component 或 XML include
  • @AfterThrowing 仍會拋出異常,必須用 @Around + try-catch

案例二:Transaction rolled back because it has been marked as rollback-only

場景重現

// A 方法:REQUIRED, rollback-for=Exception
void a() { b(); }

// B 方法:READ_ONLY (默認 REQUIRED)
void b() { 
    try { ... } catch (Exception e) { log.error(e); } // 吞掉異常
}

根因

  1. B 方法異常被捕獲,但事務標記為 rollback-only
  2. A 方法繼續執行,提交時發現標記,拋出異常

解決

將查詢類方法 B 事務傳播設置為 NOT_SUPPORTED(不需要事務),或 SUPPORTS(跟隨外部事務但不標記回滾)。

<tx:method name="query*" propagation="NOT_SUPPORTED" read-only="true" />

參考資料

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved