繁体   English   中英

Spring Boot手动提交事务

[英]Spring boot manually commit transaction

在我的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();
                }
            });
    }

家长回购

@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(在此处看到),但是我似乎无法使这些操作一起提交。

编辑:似乎我一直在与alter table ,因为它将始终提交。

我遇到的问题是在插入之前会执行删除操作,因此在此期间,对数据库的任何调用都不会返回任何数据

您是否配置了JPA和JDBC来共享事务?

如果不是,那么您基本上是在使用两种不同的机制来访问数据( EntityManagerJdbcTempate ),它们各自维护与数据库的独立连接。 可能发生的情况是,只有EntityManager加入@Transactional创建的事务; JdbcTemplate操作可以在没有事务上下文的情况下执行(阅读:在AUTOCOMMIT模式下),也可以在单独的事务中执行。

看到这个问题 它有些旧,但是再次使用JPAJdbc并不是完全常见的用例。 另外,看看JpaTransactionManager的Javadoc

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM