【问题标题】:Mysql: disable autocommit with each insert in SpringMysql:在 Spring 中每次插入时禁用自动提交
【发布时间】:2014-06-21 09:03:48
【问题描述】:

我正在使用 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
}

我的问题是,在逐步调试或强制失败时,FirstSecondThirs 会立即提交到数据库,而无需事务处理行为。

我的代码或方法有什么问题吗?我应该将 INSERTs 语句直接放在 doInTransactionWithoutResult 方法中吗?我应该以另一种方式执行此操作,因此三个插入是以事务方式完成的吗?

任何帮助将不胜感激。 问候

【问题讨论】:

  • 您使用的是 MySQL,请确保您使用的是支持事务的表。 MyISAM 表不支持事务,请确保它们是 InnoDB 表。为什么不使用声明式事务,而是使用手动事务? JdbcTemplateTransactionTemplate 也是线程安全的,在你的上下文中创建它们,注入和重用它们。特别是JdbcTemplate 是一个相当大且耗时的对象构造。
  • @m-deinum,谢谢你的回答。我将尝试声明性事务。我正在使用 InnoDB 表(已验证)。

标签: mysql spring transactions spring-transactions bonecp


【解决方案1】:

正如 Martin 所建议的,使用 @Transactional 的声明性事务对此更好,并且对我有用。所以,谢谢

这两个链接在这个主题中对我很有帮助:

Propagation types

@Transactional example

【讨论】:

    猜你喜欢
    • 2016-06-29
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    相关资源
    最近更新 更多