首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

MyBatis/Spring JDBC 批量插入無報錯但數據未入庫:事務未提交是隱形殺手

     編輯:程式設計疑難解答

現象與日誌分析

DEBUG PreparedStatement - Executing Statement: insert into user_currentcy_account_info ... 
DEBUG PreparedStatement - Parameters: [8f3de5e0..., 20161031792910317771292672, 0, 20161209093957, 01]
DEBUG DataSourceUtils - Returning JDBC Connection to DataSource  // 連接歸還,事務隱式回滾

SQL 正確、參數正確、連接正常,但數據庫無新增記錄。

根因:缺少事務提交

  • Spring 默認事務傳播行為 PROPAGATION_REQUIRED,但未在服務層方法上標註 @Transactional。
  • 或配置了事務管理器但切面未生效(如未掃描到包、註解驅動未開啟)。
  • 連接池歸還連接時(DataSourceUtils.releaseConnection),檢測到未提交事務 → 自動回滾。

修復方案

方案一:服務層添加 @Transactional(推薦)

@Service
public class AccountService {
    @Autowired AccountMapper mapper;

    @Transactional(rollbackFor = Exception.class)  // 關鍵!
    public void createAccount(AccountDTO dto) {
        mapper.insert(dto);  // 此處執行 insert
    }
}

方案二:XML 配置事務切面

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" rollback-for="java.lang.Exception"/>
    </tx:attributes>
</tx:advice>
<aop:config>
    <aop:pointcut id="serviceOps" expression="execution(* com..service..*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOps"/>
</aop:config>

方案三:手動提交(不推薦,侵入性強)

Connection conn = dataSource.getConnection();
try {
    conn.setAutoCommit(false);
    // 批量操作
    conn.commit();  // 手動提交
} catch (Exception e) {
    conn.rollback();
    throw e;
} finally {
    conn.close();
}

排查檢查清單

  1. 服務類/方法是否有 @Transactional?
  2. @EnableTransactionManagement 是否在配置類上?
  3. 事務管理器 Bean 名稱是否為 transactionManager(默認)?
  4. 數據源是否為同一個 DataSource Bean?
  5. 異常類型是否在 rollbackFor 範圍內?

最佳實踐

  • 事務邊界盡量在 Service 層,不要在 Controller 或 DAO 層。
  • 只讀查詢加 @Transactional(readOnly = true) 優化性能。
  • 異常拋出策略:rollbackFor = Exception.class 覆蓋所有受檢/非受檢異常。

「SQL 執行了但數據沒存」十有八九是事務沒提交 —— 給 Service 層加上 @Transactional,讓 Spring 幫你守住 ACID 底線。

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