[jboss-jira] [JBoss JIRA] (JBJCA-1339) CheckValidConnectionSQL can open a transaction, preventing application from changing transaction isolation level (PostgreSQL)

Tomas Hofman (JIRA) issues at jboss.org
Mon Feb 6 08:45:00 EST 2017


Tomas Hofman created JBJCA-1339:
-----------------------------------

             Summary: CheckValidConnectionSQL can open a transaction, preventing application from changing transaction isolation level (PostgreSQL)
                 Key: JBJCA-1339
                 URL: https://issues.jboss.org/browse/JBJCA-1339
             Project: IronJacamar
          Issue Type: Bug
    Affects Versions: 1.2.7.Final
            Reporter: Tomas Hofman


PostgreSQL driver only allows changing the transaction isolation level when transaction is not opened. Under certain circumstances, an application can receive a connection with already opened transaction and an attempt to change transaction isolation level will lead to exception.

This happens with the PostgreSQL driver and with CheckValidConnectionSQL checker configured to run a select statement to verify connections retrieved from the pool.

The scenario is as follows:

# A connection is retrieved from the pool for the 1st app and CheckValidConnectionSQL verifies it by running a select statement (autocommit is set to true by default). This statement is run directly via the jdbc connection, not the wrapper.
# 1st app receives the connection, sets autocommit=false, perform some work and commits a transaction.
# The connection is returned to the pool, {{cleanup()}} method is called on LocalManagedConnection wrapper, which sets autocommit=true. This however doesn't reset autocommit on the wrapped jdbc connection yet, which would only happen just before executing another SQL statement f.i.
# The same connection is retrieved from the pool for the 2nd app and CheckValidConnectionSQL runs the query. Because the jdbc connection has still autocommit=false, new transaction is opened.
# 2nd app receives the connection and calls {{setTransactionIsolation()}}, which throws an exception because the transaction is open.

Possible solution could be that the {{cleanup()}} method propagates the autocommit=true to the wrapped jdbc connection immediately.



--
This message was sent by Atlassian JIRA
(v7.2.3#72005)


More information about the jboss-jira mailing list