如果没有明确设置,hibernate使用的默认隔离级别是什么?

时间:2011-06-26 13:47:08

标签: hibernate isolation-level transaction-isolation

我有一个使用hibernate版本3.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)

所以,我的问题如下:

  1. “2”值来自何处?由于默认值是REPEATABLE_READ,为什么 getDefaultTransactionIsolation()会返回READ_COMMITTED?
  2. hibernate毕竟使用的隔离级别是多少? REPEATABLE_READ还是READ_COMMITTED?
  3. 我认为当没有设置隔离级别时,hibernate应该使用底层数据库的默认值。这是真的?也许jbdc驱动程序实现自己设置了一个默认值,而hibernate使用它?

1 个答案:

答案 0 :(得分:14)

看起来像meta.getDefaultTransactionIsolation()); 在mysql驱动程序

中实现DatabaseMetaData时是硬编码的

公共类DatabaseMetaData实现java.sql.DatabaseMetaData 线...


1475    public int getDefaultTransactionIsolation() throws java.sql.SQLException JavaDoc {
1476        if (this.conn.supportsIsolationLevel()) {
1477            return java.sql.Connection.TRANSACTION_READ_COMMITTED;
1478        } else {
1479            return java.sql.Connection.TRANSACTION_NONE;
1480        }
1481    }

所以我敢打赌并信任getSession()。connection()。getTransactionIsolation()