【发布时间】: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