簡體   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