[keycloak-user] ProviderFactory::postInit + transactions = startup failure

Dmitry Telegin mitya at cargosoft.ru
Sun Jul 2 21:50:03 EDT 2017


https://issues.jboss.org/browse/KEYCLOAK-5132

Meanwhile I've found a workaround - just run a transaction in a new
thread. However, this should be a "managed thread" - see issue details
& comments for more info.

В Wed, 28/06/2017 в 21:18 +0300, Dmitry Telegin пишет:
> Hi,
> 
> (TL;DR) if a KeycloakTransaction is opened from
> ProviderFactory::postInit, sometimes the transaction is already
> active
> on the underlying
> org.jboss.jca.adapters.jdbc.local.LocalManagedConnection, which leads
> to errors.
> 
> (full version) I think it's essential for the providers to be able to
> access realm data in postInit(). For that, a transaction is required;
> using KeycloakModelUtils.runJobInTransaction() is a convenient method
> to do that:
> 
>     @Override
>     public void postInit(KeycloakSessionFactory factory) {
>         KeycloakModelUtils.runJobInTransaction(factory,
> (KeycloakSession session) -> {
>             List<RealmModel> realms = session.realms().getRealms();
>             // do stuff
>         });
>     }
> 
> When such a provider is deployed, in about half of cases Keycloak
> fails
> to start due to the following exception:
> 
> java.sql.SQLException: IJ031017: You cannot set autocommit during a
> managed transaction
> 
> (see full stacktrace here https://pastebin.com/ETtPqXQk)
> 
> I've managed to track it down to something that looks like
> transaction
> clash over a single instance of
> org.jboss.jca.adapters.jdbc.local.LocalManagedConnection. What
> happens
> is that the two treads at the same time begin two
> KeycloakTransactions
> which end up with the same instance of LocalManagedConnection. The
> above exception results from the second begin() call.
> 
> There's a system property called "ironjacamar.jdbc.ignoreautocommit"
> that allows to ignore the situation, but I think it's dangerous
> because
> it doesn't eliminate the transaction clash, just suppresses the
> check.
> If I'm not mistaken, this began to happen around Keycloak 2.2.x,
> which
> coincides with the changes to Keycloak transaction management. That
> said, do I need now some additional transaction coordination with the
> rest of Keycloak, or is it a bug? If former, how do I do that? If
> latter, how do we fix it?
> 
> I hope we'll sort it out, since the ability to access the data at
> every
> phase of provider's lifecycle seems something fundamental to me.
> 
> Regards,
> Dmitry
> _______________________________________________
> keycloak-user mailing list
> keycloak-user at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/keycloak-user


More information about the keycloak-user mailing list