Mysql:在Spring中禁用每个插入的自动提交

时间:2014-06-21 09:03:48

标签: mysql spring transactions spring-transactions bonecp

我正在使用Spring 4.0.5,Mysql 5.6.19和BoneCP 0.8.0

我的问题是,在应用程序中定义的一个事务中,MySql提交每个插入或更新,因此它不进行事务。

首先,我已经阅读了一些像我这样的问题,但是在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
}

我的问题是,在逐步调试或强制失败时,第一个第二个第三个​​立即提交到数据库,无需事务行为。

我的代码或方法有什么问题吗?我应该将INSERT句子直接放在 doInTransactionWithoutResult 方法中吗?我应该以另一种方式做到这一点,所以这三个插入是以事务方式完成的吗?

非常感谢任何帮助。 此致

1 个答案:

答案 0 :(得分:0)

正如马丁所说,与@Transactional的声明性交易对此更好,对我有用。所以,谢谢你

在这个主题中,这两个链接对我非常有帮助:

Propagation types

@Transactional example