2014-06-21 294 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