一尘不染

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

hibernate

我有一个使用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)

因此,我的问题如下:

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

阅读 588

收藏
2020-06-20

共1个答案

一尘不染

看起来像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()

2020-06-20