keycloak-uncached

Details

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;
         }