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

问题描述

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

解决方法

我有一个使用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使用它吗?

相关文章

猜你在找的编程问答相关文章

怎样才能让 Git“忘记”一个被跟踪但现在在 .gitignore 中的文件?
Python 中的metaclasses是什么?
如何在 Linux 上查找包含特定文本的所有文件?
如何从异步调用返回响应
如何在一个表达式中合并两个字典(取字典的并集)?
HTTP 中的 POST 和 PUT 有什么区别?
使用 Git 将最近的提交移动到新分支
在 JavaScript 比较中应该使用哪个等于运算符 (== vs ===)?