From d8a0ec046763d6ca6426b681ff2c4bf54e7fad93 Mon Sep 17 00:00:00 2001 From: Viktor Seifert Date: Mon, 17 Apr 2023 11:48:12 +0200 Subject: [PATCH] RED-6467: Split query into a select and a update query to prevent transaction rollbacks --- .../dictionaryentry/QueryExecutor.java | 38 ++++++++++++++----- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/dictionaryentry/QueryExecutor.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/dictionaryentry/QueryExecutor.java index 381b02892..e191e1658 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/dictionaryentry/QueryExecutor.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/dictionaryentry/QueryExecutor.java @@ -19,10 +19,14 @@ import lombok.experimental.FieldDefaults; @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) class QueryExecutor { - private static final String UNDELETE_ENTRIES_QUERY = """ + private static final String FETCH_ENTRY_VALUES_QUERY = """ + select value from ::tableName:: + where type_id = :typeId and value in (:entries)"""; + + private static final String UPDATE_ENTRIES_QUERY = """ update ::tableName:: set deleted = false, version = :version - where type_id = :typeId and value in (:entries) returning value"""; + where type_id = :typeId and value in (:entries)"""; // Currently (2023-04-13) there is a limitation in the Postgres JDBC driver, that limits the number of elements in a "IN" clause // to the max value of a 'short'. We subtract a small value to be on the safe side, since it is unclear what contributes @@ -39,11 +43,16 @@ class QueryExecutor { @Transactional public LinkedList runUndeleteQueryInBatches(String typeId, Set entries, long version, String tableName) { - String sqlString = getUndeleteEntriesQuery(tableName); + String fetchSql = getFetchEntryValuesQuery(tableName); - Query query = entityManager.createNativeQuery(sqlString); - query.setParameter("typeId", typeId); - query.setParameter("version", version); + Query fetchEntryValuesQuery = entityManager.createNativeQuery(fetchSql); + fetchEntryValuesQuery.setParameter("typeId", typeId); + + String updateSql = getUpdateEntriesQuery(tableName); + + Query updateEntriesQuery = entityManager.createNativeQuery(updateSql); + updateEntriesQuery.setParameter("typeId", typeId); + updateEntriesQuery.setParameter("version", version); var results = new LinkedList(); @@ -56,8 +65,11 @@ class QueryExecutor { break; } - query.setParameter("entries", entryList.subList(fromIndex, toIndex)); - results.addAll(query.getResultList()); + fetchEntryValuesQuery.setParameter("entries", entryList.subList(fromIndex, toIndex)); + results.addAll(fetchEntryValuesQuery.getResultList()); + + updateEntriesQuery.setParameter("entries", entryList.subList(fromIndex, toIndex)); + updateEntriesQuery.executeUpdate(); fromIndex += ELEMENT_CHUNK_SIZE; toIndex += ELEMENT_CHUNK_SIZE; @@ -67,9 +79,15 @@ class QueryExecutor { } - private String getUndeleteEntriesQuery(String tableName) { + private String getFetchEntryValuesQuery(String tableName) { - return UNDELETE_ENTRIES_QUERY.replace("::tableName::", tableName); + return FETCH_ENTRY_VALUES_QUERY.replace("::tableName::", tableName); + } + + + private String getUpdateEntriesQuery(String tableName) { + + return UPDATE_ENTRIES_QUERY.replace("::tableName::", tableName); } }