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 正確、參數正確、連接正常,但數據庫無新增記錄。
PROPAGATION_REQUIRED,但未在服務層方法上標註 @Transactional。DataSourceUtils.releaseConnection),檢測到未提交事務 → 自動回滾。@Service
public class AccountService {
@Autowired AccountMapper mapper;
@Transactional(rollbackFor = Exception.class) // 關鍵!
public void createAccount(AccountDTO dto) {
mapper.insert(dto); // 此處執行 insert
}
}
<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();
}
@Transactional?@EnableTransactionManagement 是否在配置類上?transactionManager(默認)?DataSource Bean?rollbackFor 範圍內?@Transactional(readOnly = true) 優化性能。rollbackFor = Exception.class 覆蓋所有受檢/非受檢異常。「SQL 執行了但數據沒存」十有八九是事務沒提交 —— 給 Service 層加上 @Transactional,讓 Spring 幫你守住 ACID 底線。