2014-06-21 290 views
0

我使用Spring 4.0.5中,MySQL 5.6.19和BoneCP與每個插入禁用自動提交0.8.0MySQL的:春季

我的問題是,在應用程序中定義一個事務,MySQL是commiting每次插入或更新,所以它不會進行交易。

首先,我看過像我這樣的一些問題,但在Spring數據源設置,這並不爲我工作:

<property name="defaultAutoCommit" value="false" /> 

我的班是這些:

DBWriter.java

private DataSourceTransactionManager txManager; // Injected in Spring Beans XML 
private IMyDAO writerDAO; 

public void saveBeans(DataContainer targetData) throws Throwable{ 
    try { 
     JdbcTemplate templateTransaction = new JdbcTemplate(txManager.getDataSource()); 

     MyTx newTx = new MyTx(targetData, templateTransaction, writerDAO); 

     TransactionTemplate txTemplate = new TransactionTemplate(txManager); 
     txTemplate.execute(newTx); 
    } catch (Throwable e) { 
     logger.error("Error saving into DB", e); 
     throw e; 
    } 
} 

MyTx.java

public class MyTx extends TransactionCallbackWithoutResult { 
private IMyDAO writerDAO; 
private DataContainer finalData; 
private JdbcTemplate txTemplate; 

public MyTx(DataContainer newData, JdbcTemplate newTxTemplate, IMyDAO writerDAO){ 
    this.finalData = newData; 
    this.txTemplate = newTxTemplate; 
    this.writerDAO = writerDAO; 
} 

@Override 
protected void doInTransactionWithoutResult(TransactionStatus status) { 
    writerDAO.saveTargetBean(newData, txTemplate); 
} 

}

MyDAO.java

private void saveTargetBean(...) { 
    jdbcTemplate.update("INSERT...", ...); // First 
    jdbcTemplate.update("INSERT...", ...); // Second 
    jdbcTemplate.update("INSERT...", ...); // Third 
} 

我的問題是,調試一步一步或者強迫失敗,首先Thirs時,立即提交到數據庫,沒有交易行爲。

我的代碼或我的方法有什麼問題嗎?我是否應該將INSERT句子直接放在doInTransactionWithoutResult方法中?我應該以另一種方式做到這一點,所以三個插入是以交易方式完成的?

任何幫助將非常感激。 Regards

+1

你正在使用MySQL確保您使用的是支持事務表。 MyISAM表不支持事務,確保它們是InnoDB表。你爲什麼不使用聲明式交易,而是使用手動交易?另外'JdbcTemplate'和'TransactionTemplate'是線程安全的,在你的上下文中創建它們,注入並重用它們。特別是'JdbcTemplate'是一個相當耗時的對象構造。 –

+0

@ m-deinum,謝謝你的回答。我會嘗試聲明式交易。我使用InnoDB表(已驗證)。 –

回答

0

正如馬丁所說,與@Transactional的聲明式交易對此更好,並且適用於我。所以,謝謝你

這兩個環節對我來說非常有幫助本主題:

Propagation types

@Transactional example