Re: revisiting transaction isolation - Mailing list pgsql-jdbc

From Dario V. Fassi
Subject Re: revisiting transaction isolation
Date
Msg-id 40F9B6CB.6050407@sistemat.com.ar
Whole thread Raw
In response to Re: revisiting transaction isolation  (Oliver Jowett <oliver@opencloud.com>)
List pgsql-jdbc

The code bellow throw an exception and I can see any transaction in progress.

Dario.

        String url   = getJdbcUrl();
        try {
            isCon = false;
            con = DriverManager.getConnection( url, usr, pwd );
            if ( con == null ) return false;
            isCon = true;
            con.setAutoCommit( autoCommit );
            int tiso  = con.getTransactionIsolation();
            try {
                    dmd = con.getMetaData();
                    int defTxIsolation  = -1;
                    if ( dmd != null && dmd.supportsTransactionIsolationLevel( tranIsolation ) ) {
                        defTxIsolation = dmd.getDefaultTransactionIsolation();
                    }
                    if ( tranIsolation >= 0 && tranIsolation != defTxIsolation ) {
                        tranIsolation = defTxIsolation;
                    }
                }
                if ( tranIsolation >= 0 ) {
                    con.setTransactionIsolation( tranIsolation );
                    tiso = con.getTransactionIsolation();
                }
            } catch ( SQLException se ) {
                se.printStackTrace();
                lastErrMsg = "\n ERROR: TransactionIsolation No Soportado = " + Tools.InfoException( se );
            }


Oliver Jowett wrote:
Kris Jurka wrote:

On Sat, 17 Jul 2004, Oliver Jowett wrote:


Currently, this type of code will fail:


 conn.setAutoCommit(false);
 if (conn.getTransactionIsolation() != Connection.TRANSACTION_SERIALIZABLE)
   conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);

The problem is that getTransactionIsolation() issues a query and thus starts a new transaction, and then setTransactionIsolation() complains you can't change isolation level mid-transaction.

I'm not sure this is reasonable behaviour. One option is to make getTransactionIsolation (and what other methods too?) not cause a BEGIN to occur if there is no transaction in progress and autocommit is off.


I see no reason for getTransactionIsolation or any driver call to start a transaction, these are only SELECTs and won't be rolled back anyway.

It's ok for getTransactionIsolation(), but what about, say, metadata queries -- we do want transaction isolation to apply there even if it's just a SELECT, right?

A quick skim of AbstractJdbc2Connection turns up these methods as candidates for ignoring autocommit:

 - getTransactionIsolation()
 - getPGType (both versions) on a cache miss

It seems reasonable to suppress BEGINs for both of those cases. I can put together a patch to do that. I'll leave the metadata queries alone for the moment.

The return value of the method getTransactionIsolation should reflect
the change in isolation level when it actually occurs. [...]

This seems confusing and error prone.

Ok -- I'll leave that alone too.

-O



pgsql-jdbc by date:

Previous
From: "Dario V. Fassi"
Date:
Subject: Re: [ADMIN] Migrate postgres databases from SQL_ASCII to UNICODE
Next
From: "Dario V. Fassi"
Date:
Subject: DatabaseMetada.supportOpenCursorsAcrossCommit() return wrong information.