Re: revisiting transaction isolation

From: "Dario V(dot) Fassi" <software(at)sistemat(dot)com(dot)ar>
To: Oliver Jowett <oliver(at)opencloud(dot)com>
Cc: Kris Jurka <books(at)ejurka(dot)com>, "pgsql-jdbc(at)postgresql(dot)org" <pgsql-jdbc(at)postgresql(dot)org>
Subject: Re: revisiting transaction isolation
Date: 2004-07-17 23:31:23
Message-ID: 40F9B6CB.6050407@sistemat.com.ar
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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

In response to

Browse pgsql-jdbc by date

  From Date Subject
Next Message Dario V. Fassi 2004-07-18 00:25:24 DatabaseMetada.supportOpenCursorsAcrossCommit() return wrong information.
Previous Message Dario V. Fassi 2004-07-17 23:26:17 Re: [ADMIN] Migrate postgres databases from SQL_ASCII to UNICODE