Deadlock on concurrent requests updating users

Hi,

I’m trying to update attributes of all users through the Admin Rest API version 7.0.1
To achieve this I created a PHP script which use Guzzle library to send concurrent requests:

<?php
/**
 * Script to reset the notification_email attribute of all users in keycloak
 */

use GuzzleHttp\Client;
use GuzzleHttp\Promise\EachPromise;
use GuzzleHttp\Psr7\Request;
use GuzzleHttp\Psr7\Response;

chdir(__DIR__ . '/../');

require 'vendor/autoload.php';
$container = require 'config/container.php';

const ADMIN_REST_API_PATH = '/auth/admin/realms/';

$config = include 'config/config.php';

$baseURI = $config['keycloak']['host'];

$realm = $config['keycloak']['realm'];
$clientId = $config['keycloak']['client_id'];
$clientSecret = $config['keycloak']['client_secret'];

$keycloakRequest = new Request(
    'POST',
    $baseURI . '/auth/realms/' . $realm . '/protocol/openid-connect/token',
    [
        'Content-Type' => 'application/x-www-form-urlencoded',
        'Authorization' =>
            'Basic ' . base64_encode($clientId . ':' . $clientSecret)
    ]
);

$client = new Client(['verify' => false]);
$response = $client->send($keycloakRequest, [
    'form_params' => [
        'grant_type' => 'client_credentials'
    ]
]);

$result = json_decode($response->getBody()->getContents(), true);
$token = $result['access_token'];

// Retrieve users
$keycloakRequest = new Request(
    'GET',
    $baseURI . ADMIN_REST_API_PATH . $realm . '/users?max=-1',
    [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer ' . $token
    ]
);
$response = $client->send($keycloakRequest);
$users = json_decode($response->getBody()->getContents());

# Mapping users/groups
$client = new Client([
    'verify' => false,
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer ' . $token
    ]
]);

foreach ($users as $user) {
    $user->attributes->notification_email[] = 0;
    $promises[] = $client->putAsync(
        $baseURI . ADMIN_REST_API_PATH . $realm . '/users/' . $user->id,
        [
            'json' => (array) $user
        ]
    );
}

$eachPromise = new EachPromise($promises, [
    // how many concurrency we are use
    'concurrency' => 4,
    'fulfilled' => function (Response $response) {},
    'rejected' => function ($reason) {
        // handle promise rejected here
        echo $reason;
    }
]);

$eachPromise->promise()->wait();

The following error seems to appear every time:

keycloak_web               | 06:52:25,579 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-5) SQL Error: 1205, SQLState: 40001
keycloak_web               | 06:52:25,580 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-5) Transaction (Process ID 51) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
keycloak_web               | 06:52:25,581 WARN  [org.keycloak.services.resources.admin.UserResource] (default task-5) Could not update user!: javax.persistence.OptimisticLockException: org.hibernate.exception.LockAcquisitionException: could not execute statement
keycloak_web               | 	at org.hibernate@5.3.10.Final//org.hibernate.internal.ExceptionConverterImpl.wrapLockException(ExceptionConverterImpl.java:277)
keycloak_web               | 	at org.hibernate@5.3.10.Final//org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:98)
keycloak_web               | 	at org.hibernate@5.3.10.Final//org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
keycloak_web               | 	at org.hibernate@5.3.10.Final//org.hibernate.query.internal.AbstractProducedQuery.executeUpdate(AbstractProducedQuery.java:1593)
keycloak_web               | 	at org.keycloak.keycloak-model-jpa@7.0.1//org.keycloak.models.jpa.UserAdapter.removeAttribute(UserAdapter.java:171)
keycloak_web               | 	at org.keycloak.keycloak-model-jpa@7.0.1//org.keycloak.models.jpa.UserAdapter.setAttribute(UserAdapter.java:147)
keycloak_web               | 	at org.keycloak.keycloak-model-infinispan@7.0.1//org.keycloak.models.cache.infinispan.UserAdapter.setAttribute(UserAdapter.java:143)
keycloak_web               | 	at org.keycloak.keycloak-services@7.0.1//org.keycloak.services.resources.admin.UserResource.updateUserFromRep(UserResource.java:227)
keycloak_web               | 	at org.keycloak.keycloak-services@7.0.1//org.keycloak.services.resources.admin.UserResource.updateUser(UserResource.java:172)
keycloak_web               | 	at jdk.internal.reflect.GeneratedMethodAccessor726.invoke(Unknown Source)
keycloak_web               | 	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
keycloak_web               | 	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
keycloak_web               | 	at org.jboss.resteasy.resteasy-jaxrs@3.7.0.Final//org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:138)
keycloak_web               | 	at org.jboss.resteasy.resteasy-jaxrs@3.7.0.Final//org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:517)
keycloak_web               | 	at org.jboss.resteasy.resteasy-jaxrs@3.7.0.Final//org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:406)
keycloak_web               | 	at org.jboss.resteasy.resteasy-jaxrs@3.7.0.Final//org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$0(ResourceMethodInvoker.java:370)
keycloak_web               | 	at org.jboss.resteasy.resteasy-jaxrs@3.7.0.Final//org.jboss.resteasy.core.interception.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:355)
keycloak_web               | 	at org.jboss.resteasy.resteasy-jaxrs@3.7.0.Final//org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:372)
keycloak_web               | 	at org.jboss.resteasy.resteasy-jaxrs@3.7.0.Final//org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:344)
keycloak_web               | 	at org.jboss.resteasy.resteasy-jaxrs@3.7.0.Final//org.jboss.resteasy.core.ResourceLocatorInvoker.invokeOnTargetObject(ResourceLocatorInvoker.java:137)
keycloak_web               | 	at org.jboss.resteasy.resteasy-jaxrs@3.7.0.Final//org.jboss.resteasy.core.ResourceLocatorInvoker.invoke(ResourceLocatorInvoker.java:106)
keycloak_web               | 	at org.jboss.resteasy.resteasy-jaxrs@3.7.0.Final//org.jboss.resteasy.core.ResourceLocatorInvoker.invokeOnTargetObject(ResourceLocatorInvoker.java:132)
keycloak_web               | 	at org.jboss.resteasy.resteasy-jaxrs@3.7.0.Final//org.jboss.resteasy.core.ResourceLocatorInvoker.invoke(ResourceLocatorInvoker.java:106)
keycloak_web               | 	at org.jboss.resteasy.resteasy-jaxrs@3.7.0.Final//org.jboss.resteasy.core.ResourceLocatorInvoker.invokeOnTargetObject(ResourceLocatorInvoker.java:132)
keycloak_web               | 	at org.jboss.resteasy.resteasy-jaxrs@3.7.0.Final//org.jboss.resteasy.core.ResourceLocatorInvoker.invoke(ResourceLocatorInvoker.java:106)
keycloak_web               | 	at org.jboss.resteasy.resteasy-jaxrs@3.7.0.Final//org.jboss.resteasy.core.ResourceLocatorInvoker.invokeOnTargetObject(ResourceLocatorInvoker.java:132)
keycloak_web               | 	at org.jboss.resteasy.resteasy-jaxrs@3.7.0.Final//org.jboss.resteasy.core.ResourceLocatorInvoker.invoke(ResourceLocatorInvoker.java:100)
keycloak_web               | 	at org.jboss.resteasy.resteasy-jaxrs@3.7.0.Final//org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:440)
keycloak_web               | 	at org.jboss.resteasy.resteasy-jaxrs@3.7.0.Final//org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:229)
keycloak_web               | 	at org.jboss.resteasy.resteasy-jaxrs@3.7.0.Final//org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:135)
keycloak_web               | 	at org.jboss.resteasy.resteasy-jaxrs@3.7.0.Final//org.jboss.resteasy.core.interception.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:355)
keycloak_web               | 	at org.jboss.resteasy.resteasy-jaxrs@3.7.0.Final//org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:138)
keycloak_web               | 	at org.jboss.resteasy.resteasy-jaxrs@3.7.0.Final//org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:215)
keycloak_web               | 	at org.jboss.resteasy.resteasy-jaxrs@3.7.0.Final//org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:227)
keycloak_web               | 	at org.jboss.resteasy.resteasy-jaxrs@3.7.0.Final//org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)
keycloak_web               | 	at org.jboss.resteasy.resteasy-jaxrs@3.7.0.Final//org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)
keycloak_web               | 	at javax.servlet.api@1.0.0.Final//javax.servlet.http.HttpServlet.service(HttpServlet.java:791)
keycloak_web               | 	at io.undertow.servlet@2.0.21.Final//io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
keycloak_web               | 	at io.undertow.servlet@2.0.21.Final//io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)
keycloak_web               | 	at org.keycloak.keycloak-services@7.0.1//org.keycloak.services.filters.KeycloakSessionServletFilter.doFilter(KeycloakSessionServletFilter.java:90)
keycloak_web               | 	at io.undertow.servlet@2.0.21.Final//io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
keycloak_web               | 	at io.undertow.servlet@2.0.21.Final//io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
keycloak_web               | 	at io.undertow.servlet@2.0.21.Final//io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
keycloak_web               | 	at io.undertow.servlet@2.0.21.Final//io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
keycloak_web               | 	at io.undertow.servlet@2.0.21.Final//io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)
keycloak_web               | 	at io.undertow.servlet@2.0.21.Final//io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
keycloak_web               | 	at org.wildfly.extension.undertow@17.0.1.Final//org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
keycloak_web               | 	at io.undertow.core@2.0.21.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
keycloak_web               | 	at io.undertow.servlet@2.0.21.Final//io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:132)
keycloak_web               | 	at io.undertow.servlet@2.0.21.Final//io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
keycloak_web               | 	at io.undertow.core@2.0.21.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
keycloak_web               | 	at io.undertow.core@2.0.21.Final//io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
keycloak_web               | 	at io.undertow.servlet@2.0.21.Final//io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
keycloak_web               | 	at io.undertow.core@2.0.21.Final//io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
keycloak_web               | 	at io.undertow.servlet@2.0.21.Final//io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
keycloak_web               | 	at io.undertow.core@2.0.21.Final//io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
keycloak_web               | 	at io.undertow.core@2.0.21.Final//io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
keycloak_web               | 	at io.undertow.core@2.0.21.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
keycloak_web               | 	at org.wildfly.extension.undertow@17.0.1.Final//org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
keycloak_web               | 	at io.undertow.core@2.0.21.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
keycloak_web               | 	at org.wildfly.extension.undertow@17.0.1.Final//org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest(GlobalRequestControllerHandler.java:68)
keycloak_web               | 	at io.undertow.core@2.0.21.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
keycloak_web               | 	at io.undertow.servlet@2.0.21.Final//io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)
keycloak_web               | 	at io.undertow.servlet@2.0.21.Final//io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)
keycloak_web               | 	at io.undertow.servlet@2.0.21.Final//io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)
keycloak_web               | 	at io.undertow.servlet@2.0.21.Final//io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
keycloak_web               | 	at io.undertow.servlet@2.0.21.Final//io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
keycloak_web               | 	at io.undertow.servlet@2.0.21.Final//io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
keycloak_web               | 	at org.wildfly.extension.undertow@17.0.1.Final//org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105)
keycloak_web               | 	at org.wildfly.extension.undertow@17.0.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
keycloak_web               | 	at org.wildfly.extension.undertow@17.0.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
keycloak_web               | 	at org.wildfly.extension.undertow@17.0.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
keycloak_web               | 	at org.wildfly.extension.undertow@17.0.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
keycloak_web               | 	at io.undertow.servlet@2.0.21.Final//io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
keycloak_web               | 	at io.undertow.servlet@2.0.21.Final//io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
keycloak_web               | 	at io.undertow.servlet@2.0.21.Final//io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
keycloak_web               | 	at io.undertow.core@2.0.21.Final//io.undertow.server.Connectors.executeRootHandler(Connectors.java:364)
keycloak_web               | 	at io.undertow.core@2.0.21.Final//io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)
keycloak_web               | 	at org.jboss.threads@2.3.3.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
keycloak_web               | 	at org.jboss.threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1982)
keycloak_web               | 	at org.jboss.threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
keycloak_web               | 	at org.jboss.threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)
keycloak_web               | 	at java.base/java.lang.Thread.run(Thread.java:834)
keycloak_web               | Caused by: org.hibernate.exception.LockAcquisitionException: could not execute statement
keycloak_web               | 	at org.hibernate@5.3.10.Final//org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:123)
keycloak_web               | 	at org.hibernate@5.3.10.Final//org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
keycloak_web               | 	at org.hibernate@5.3.10.Final//org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)
keycloak_web               | 	at org.hibernate@5.3.10.Final//org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99)
keycloak_web               | 	at org.hibernate@5.3.10.Final//org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:178)
keycloak_web               | 	at org.hibernate@5.3.10.Final//org.hibernate.hql.internal.ast.exec.BasicExecutor.doExecute(BasicExecutor.java:100)
keycloak_web               | 	at org.hibernate@5.3.10.Final//org.hibernate.hql.internal.ast.exec.BasicExecutor.execute(BasicExecutor.java:59)
keycloak_web               | 	at org.hibernate@5.3.10.Final//org.hibernate.hql.internal.ast.exec.DeleteExecutor.execute(DeleteExecutor.java:109)
keycloak_web               | 	at org.hibernate@5.3.10.Final//org.hibernate.hql.internal.ast.QueryTranslatorImpl.executeUpdate(QueryTranslatorImpl.java:453)
keycloak_web               | 	at org.hibernate@5.3.10.Final//org.hibernate.engine.query.spi.HQLQueryPlan.performExecuteUpdate(HQLQueryPlan.java:378)
keycloak_web               | 	at org.hibernate@5.3.10.Final//org.hibernate.internal.SessionImpl.executeUpdate(SessionImpl.java:1532)
keycloak_web               | 	at org.hibernate@5.3.10.Final//org.hibernate.query.internal.AbstractProducedQuery.doExecuteUpdate(AbstractProducedQuery.java:1602)
keycloak_web               | 	at org.hibernate@5.3.10.Final//org.hibernate.query.internal.AbstractProducedQuery.executeUpdate(AbstractProducedQuery.java:1584)
keycloak_web               | 	... 79 more
keycloak_web               | Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Transaction (Process ID 51) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
keycloak_web               | 	at com.microsoft.sqlserver.jdbc//com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:262)
keycloak_web               | 	at com.microsoft.sqlserver.jdbc//com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1624)
keycloak_web               | 	at com.microsoft.sqlserver.jdbc//com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:594)
keycloak_web               | 	at com.microsoft.sqlserver.jdbc//com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:524)
keycloak_web               | 	at com.microsoft.sqlserver.jdbc//com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7194)
keycloak_web               | 	at com.microsoft.sqlserver.jdbc//com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2979)
keycloak_web               | 	at com.microsoft.sqlserver.jdbc//com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:248)
keycloak_web               | 	at com.microsoft.sqlserver.jdbc//com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:223)
keycloak_web               | 	at com.microsoft.sqlserver.jdbc//com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(SQLServerPreparedStatement.java:473)
keycloak_web               | 	at org.jboss.ironjacamar.jdbcadapters@1.4.16.Final//org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.executeUpdate(WrappedPreparedStatement.java:537)
keycloak_web               | 	at org.hibernate@5.3.10.Final//org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:175)
keycloak_web               | 	... 87 more
keycloak_web               | 

Guzzle returns this error:

GuzzleHttp\Exception\ClientException: Client error: `PUT auth/admin/realms/test/users/de00e888-dac8-461c-ac92-a3fc99ba141e` resulted in a `409 Conflict` response:
{"errorMessage":"Could not update user!"}

My temporary solution is to avoid concurrency, but I think is not a good idea updating >1000 users without it.

This happens even when same user tries to authenticate concurrently.
E.g. If we have an API which performs some business operation where we don’t maintain session, KeyCloak auth happens on credentials & not token. In this case, my API calls KeyCloak for authentication for each request. If the API is called for bulk requests & all calls have same userId; KeyCloak fails intermittently & returns same error (LockAcquisitionException) for few requests.

Is this fixed in any latest version of KeyCloak?

hey do you already discovered fix for this issue, we have same problem…
hope fix will come in keycloak …