【问题标题】:Spring boot manually commit transactionSpring Boot 手动提交事务
【发布时间】:2019-11-25 15:27:48
【问题描述】:

在我的 Spring Boot 应用程序中,我在单个事务中删除大量数据并将其插入到我的 MySQL 数据库中。理想情况下,我只想在最后将结果提交到我的数据库中,所以要么全部提交,要么全部提交。我遇到了我的删除将在我的插入之前提交的问题,因此在此期间对数据库的任何调用都不会返回任何数据(不好)。有没有办法手动提交事务?

我的主要逻辑是:

    @Transactional
    public void saveParents(List<Parent> parents) {

        parentRepo.deleteAllInBatch();
        parentRepo.resetAutoIncrement();

//I'm setting the id manually before hand
String sql = "INSERT INTO parent " +
                    "(id, name, address, number) " +
                    "VALUES ( ?, ?, ?, ?)";

            jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
                @Override
                public void setValues(PreparedStatement ps, int i) throws SQLException {
                    Parent parent = parents.get(i);

                    ps.setInt(1, parent.getId());
                    ps.setString(2, parent.getName());
                    ps.setString(3, parent.getAddress());
                    ps.setString(4, parent.getNumber());
                }

                @Override
                public int getBatchSize() {
                    return parents.size();
                }
            });
    }

父回购

@Repository
@Transactional
public interface ParentRepo extends JpaRepository<Parent, Integer> {
    @Modifying
    @Query(
            value = "alter table parent auto_increment = 1",
            nativeQuery = true
    )
    void resetAutoIncrement();
}

编辑: 所以我改变了

    parentRepo.deleteAllInBatch();
    parentRepo.resetAutoIncrement();

到

    jdbcTemplate.update("DELETE FROM output_stream");
    jdbcTemplate.update("alter table output_stream auto_increment = 1");

为了尝试避免 jpa 的事务,但无论我尝试什么,每个操作似乎都是单独提交的。我已经尝试过 TransactionTemplate 和实现 PlatformTransactionManager(见 here),但我似乎无法让这些操作一起提交。

编辑:看来我遇到的问题是alter table,因为它总是会提交。

【问题讨论】:

  • 为什么不使用原生查询来删除和插入另一个?
  • 在删除和 jdbc 模板为我提供了所需的性能巨大提升之后,我正在执行大量插入操作。

标签: spring-boot jpa jdbc


【解决方案1】:

我遇到了我的删除将在我的插入之前提交的问题,因此在此期间对数据库的任何调用都不会返回任何数据

您是否将 JPA 和 JDBC 配置为共享事务?

如果不是,那么您基本上是在使用两种不同的机制来访问数据(EntityManager 和JdbcTempate),它们中的每一个都与数据库保持单独的连接。可能发生的情况是只有EntityManager 加入@Transactional 创建的事务; JdbcTemplate 操作在没有事务上下文的情况下执行(阅读:在AUTOCOMMIT 模式下)或完全在单独的事务中执行。

见this question。它有点老了,但话又说回来,一起使用 JPA 和 Jdbc 并不是一个常见的用例。另外,请查看the Javadoc for JpaTransactionManager。

【讨论】:

  • 谢谢!是的,这不是很常见,但我需要 jdbcTemplate 的性能,因为相比之下 Spring boot 的保存速度非常慢。我尝试配置 JpaTransactionManager 但这似乎对我不起作用。我在编辑中尝试了另一种方法,我认为至少应该使交易保持一致。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多