Re: revisiting transaction isolation
От | Dario V. Fassi |
---|---|
Тема | Re: revisiting transaction isolation |
Дата | |
Msg-id | 40F9B6CB.6050407@sistemat.com.ar обсуждение исходный текст |
Ответ на | Re: revisiting transaction isolation (Oliver Jowett <oliver@opencloud.com>) |
Список | 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 по дате отправления: