我有一个使用hibernate3.6.4版和c3p0 0.9.1.2版进行连接池的应用程序。我的基础RDBMS是MySql 5.0.67版。
我的MySql安装表明默认的事务隔离级别为“ REPEATABLE-READ”(4):
mysql> select @@GLOBAL.tx_isolation, @@tx_isolation; +-----------------------+-----------------+ | @@GLOBAL.tx_isolation | @@tx_isolation | +-----------------------+-----------------+ | REPEATABLE-READ | REPEATABLE-READ | +-----------------------+-----------------+
我尚未在hibernate.cfg.xml或应用程序中的任何位置更改或配置事务隔离级别。在应用程序中,我使用以下代码来打印配置:
DatabaseMetaData meta = getSession().connection().getMetaData(); System.out.println("Default Tx Isolation: " + meta.getDefaultTransactionIsolation()); System.out.println("Current Tx Isolation: " + getSession().connection().getTransactionIsolation());
我得到以下结果:
Default Tx Isolation: 2 (=READ_COMMITTED) Current Tx Isolation: 4 (=REPEATABLE_READ)
因此,我的问题如下:
看起来像meta.getDefaultTransactionIsolation()); 在mysql驱动程序的DatabaseMetaData实现中被硬编码
公共类DatabaseMetaData实现java.sql.DatabaseMetaData行…。
1475 public int getDefaultTransactionIsolation()抛出java.sql.SQLException JavaDoc { 第1476章谁来了 1477返回java.sql.Connection.TRANSACTION_READ_COMMITTED; 1478} else { 1479返回java.sql.Connection.TRANSACTION_NONE; 1480} 1481}
所以我打赌并信任getSession()。connection()。getTransactionIsolation()