From c7ef0584d87f5be488149c9b9592b5b53cd376ab Mon Sep 17 00:00:00 2001 From: Avgustin Marinov Date: Fri, 14 Aug 2026 13:40:13 +0300 Subject: [PATCH] Fix JpaDeploymentManagement @Transactionl write declarations Signed-off-by: Avgustin Marinov --- .../management/JpaDeploymentManagement.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaDeploymentManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaDeploymentManagement.java index 6da8efafd9..4cc4f141bc 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaDeploymentManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaDeploymentManagement.java @@ -375,7 +375,7 @@ private Action forceQuitAction0(final long actionId) { } @Override - @Transactional + @Transactional(isolation = Isolation.READ_COMMITTED) @Retryable(includes = ConcurrencyFailureException.class, maxRetriesString = Constants.RETRY_MAX, delayString = Constants.RETRY_DELAY) public Action forceTargetAction(final long actionId) { final JpaAction action = actionRepository.findById(actionId) @@ -390,7 +390,7 @@ public Action forceTargetAction(final long actionId) { } @Override - @Transactional + @Transactional(isolation = Isolation.READ_COMMITTED) public void deleteAction(final long actionId) { log.info("Deleting action {}", actionId); final JpaAction action = actionRepository.getById(actionId); @@ -404,7 +404,7 @@ public void deleteAction(final long actionId) { } @Override - @Transactional + @Transactional(isolation = Isolation.READ_COMMITTED) public void deleteActionsByRsql(final String rsql) { log.info("Deleting actions matching rsql {}", rsql); final Specification rsqlSpec = QLSupport.getInstance().buildSpec(rsql, ActionFields.class); @@ -427,7 +427,7 @@ private static PredicateSpecification predicateSpec(final Specification actionIds) { log.info("Deleting actions with ids {}", actionIds); checkActionsEligibleForDeletion(actionIds); @@ -435,7 +435,7 @@ public void deleteActionsByIds(final List actionIds) { } @Override - @Transactional + @Transactional(isolation = Isolation.READ_COMMITTED) public void deleteTargetActionsByIds(final String controllerId, final List actionsIds) { log.info("Delete actions for target {} with action ids {}", controllerId, actionsIds); checkActionsEligibleForDeletion(actionsIds); @@ -443,7 +443,7 @@ public void deleteTargetActionsByIds(final String controllerId, final List } @Override - @Transactional + @Transactional(isolation = Isolation.READ_COMMITTED) public void deleteOldestTargetActions(final String controllerId, final int keepLast) { final JpaTarget target = targetRepository.findByControllerId(controllerId).orElseThrow(EntityNotFoundException::new); // check access to target since deletion will be executed via native query @@ -469,6 +469,7 @@ public void cancelInactiveScheduledActionsForTargets(final List targetIds) } @Override + @Transactional(isolation = Isolation.READ_COMMITTED) public void startScheduledActionsByRolloutGroupParent(final long rolloutId, final long distributionSetId, final Long rolloutGroupParentId) { while (DeploymentHelper.runInNewTransaction(txManager, "startScheduledActions-" + rolloutId, status -> { final PageRequest pageRequest = PageRequest.of(0, ACTION_PAGE_LIMIT); @@ -492,6 +493,7 @@ public void startScheduledActionsByRolloutGroupParent(final long rolloutId, fina } @Override + @Transactional(isolation = Isolation.READ_COMMITTED) public void startScheduledActions(final List rolloutGroupActions) { // Close actions already assigned and collect pending assignments final List pendingTargetAssignments = rolloutGroupActions.stream() @@ -519,7 +521,7 @@ public Optional findInstalledDistributionSet(final String contr } @Override - @Transactional + @Transactional(isolation = Isolation.READ_COMMITTED) public int deleteActionsByStatusAndLastModifiedBefore(final Set status, final long lastModified) { if (status.isEmpty()) { return 0; @@ -550,7 +552,7 @@ public boolean hasPendingCancellations(final Long targetId) { } @Override - @Transactional + @Transactional(isolation = Isolation.READ_COMMITTED) public void cancelActionsForDistributionSet(final ActionCancellationType cancelationType, final DistributionSet distributionSet) { actionRepository.findAll(ActionSpecifications.byDistributionSetIdAndActiveAndStatusIsNot(distributionSet.getId(), Status.CANCELING)) .forEach(action -> { @@ -582,6 +584,7 @@ public void cancelActionsForDistributionSet(final ActionCancellationType cancela public record MaxAssignmentsExceededInfo(long targetId, long requested, AssignmentQuotaExceededException quotaExceededException) {} @Override + @Transactional(isolation = Isolation.READ_COMMITTED) public void handleMaxAssignmentsExceeded( final Long targetId, final Long requested, final AssignmentQuotaExceededException quotaExceededException) { int actionsPurgePercentage = getActionsPurgePercentage();