在我的Spring启动应用程序中,我要通过一次事务删除大量数据并将其插入到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();
}
});
}
ParentRepo
@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),但似乎无法使这些操作一起提交。
答案 0 :(得分:0)
我遇到的问题是,在插入之前删除将被提交,因此在此期间,对数据库的任何调用都将不返回任何数据
您是否配置了JPA和JDBC来共享事务?
如果没有,那么您基本上是在使用两种不同的机制来访问数据(EntityManager
和JdbcTempate
),它们各自维护与数据库的独立连接。可能发生的情况是只有EntityManager
加入了@Transactional
创建的交易; JdbcTemplate
操作可以在没有事务上下文的情况下(在AUTOCOMMIT
模式下阅读)或在单独的事务中执行。
请参见this question。它有些陈旧,但再次使用JPA
和Jdbc
并不是完全常见的用例。另外,请看the Javadoc for JpaTransactionManager
。