diff --git a/model/api/src/main/java/org/keycloak/models/KeycloakTransactionManager.java b/model/api/src/main/java/org/keycloak/models/KeycloakTransactionManager.java
index db1500e..abc64ea 100755
--- a/model/api/src/main/java/org/keycloak/models/KeycloakTransactionManager.java
+++ b/model/api/src/main/java/org/keycloak/models/KeycloakTransactionManager.java
@@ -7,5 +7,6 @@ package org.keycloak.models;
public interface KeycloakTransactionManager extends KeycloakTransaction {
void enlist(KeycloakTransaction transaction);
+ void enlistAfterCompletion(KeycloakTransaction transaction);
}
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheModelProvider.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheModelProvider.java
index 3cf63a6..d116744 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheModelProvider.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheModelProvider.java
@@ -54,7 +54,7 @@ public class DefaultCacheModelProvider implements CacheModelProvider {
this.cache = cache;
this.session = session;
- session.getTransaction().enlist(getTransaction());
+ session.getTransaction().enlistAfterCompletion(getTransaction());
}
@Override
diff --git a/services/src/main/java/org/keycloak/services/DefaultKeycloakTransactionManager.java b/services/src/main/java/org/keycloak/services/DefaultKeycloakTransactionManager.java
old mode 100644
new mode 100755
index 3b1358a..a63ed9d
--- a/services/src/main/java/org/keycloak/services/DefaultKeycloakTransactionManager.java
+++ b/services/src/main/java/org/keycloak/services/DefaultKeycloakTransactionManager.java
@@ -12,6 +12,7 @@ import java.util.List;
public class DefaultKeycloakTransactionManager implements KeycloakTransactionManager {
private List<KeycloakTransaction> transactions = new LinkedList<KeycloakTransaction>();
+ private List<KeycloakTransaction> afterCompletion = new LinkedList<KeycloakTransaction>();
private boolean active;
private boolean rollback;
@@ -25,6 +26,15 @@ public class DefaultKeycloakTransactionManager implements KeycloakTransactionMan
}
@Override
+ public void enlistAfterCompletion(KeycloakTransaction transaction) {
+ if (active && !transaction.isActive()) {
+ transaction.begin();
+ }
+
+ afterCompletion.add(transaction);
+ }
+
+ @Override
public void begin() {
if (active) {
throw new IllegalStateException("Transaction already active");
@@ -47,6 +57,14 @@ public class DefaultKeycloakTransactionManager implements KeycloakTransactionMan
exception = exception == null ? e : exception;
}
}
+ for (KeycloakTransaction tx : afterCompletion) {
+ try {
+ tx.commit();
+ } catch (RuntimeException e) {
+ exception = exception == null ? e : exception;
+ }
+ }
+
if (exception != null) {
throw exception;
}
@@ -62,6 +80,13 @@ public class DefaultKeycloakTransactionManager implements KeycloakTransactionMan
exception = exception != null ? e : exception;
}
}
+ for (KeycloakTransaction tx : afterCompletion) {
+ try {
+ tx.rollback();
+ } catch (RuntimeException e) {
+ exception = exception != null ? e : exception;
+ }
+ }
if (exception != null) {
throw exception;
}