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
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 |