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
你正在使用MySQL確保您使用的是支持事務表。 MyISAM表不支持事務,確保它們是InnoDB表。你爲什麼不使用聲明式交易,而是使用手動交易?另外'JdbcTemplate'和'TransactionTemplate'是線程安全的,在你的上下文中創建它們,注入並重用它們。特別是'JdbcTemplate'是一個相當耗時的對象構造。 –
@ m-deinum,謝謝你的回答。我會嘗試聲明式交易。我使用InnoDB表(已驗證)。 –