如果未明确设置,hibernate使用的默认隔离级别是什么? [英] What is default isolation level hibernate uses if not explicitly set?

查看:179
本文介绍了如果未明确设置,hibernate使用的默认隔离级别是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个应用程序使用休眠版本3.6.4和c3p0版本0.9.1.2进行连接池。我的基础RDBMS是MySql版本5.0.67。



我的MySql安装表明默认的事务隔离级别是REPEATABLE-READ(4):

 的MySQL>选择@@ GLOBAL.tx_isolation,@@ tx_isolation; 
+ ----------------------- + ----------------- +
| @@ GLOBAL.tx_isolation | @@ tx_isolation |
+ ----------------------- + ----------------- +
|可重复阅读|可重复阅读|
+ ----------------------- + ----------------- +

我没有在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());

我得到以下结果:

<$ (= READ_COMMITTED)
当前发送隔离:4(= REPEATABLE_READ)

所以,我的问题如下:


  1. 2值来自哪里?由于缺省值是REPEATABLE_READ,为什么 getDefaultTransactionIsolation()返回READ_COMMITTED?

  2. 休眠使用的隔离级别是什么? REPEATABLE_READ或READ_COMMITTED?

  3. 我认为当没有设置隔离级别时,hibernate应该使用底层数据库的默认值。这是真的?也许jbdc驱动程序实现自己设置默认值,而hibernate使用它?
  4. 像meta.getDefaultTransactionIsolation());
    在mysql驱动程序中的DatabaseMetaData的实现中被硬编码


    public class DatabaseMetaData implements java.sql.DatabaseMetaData
    lines ....
    p>

     

    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返回java.sql.Connection.TRANSACTION_NONE;
    1480}
    1481}

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


    I have an application that uses hibernate version 3.6.4, and c3p0 version 0.9.1.2 for connection pooling. My underlying RDBMS is MySql version 5.0.67.

    My installation of MySql indicates that the default transaction isolation level is "REPEATABLE-READ" (4):

    mysql> select @@GLOBAL.tx_isolation, @@tx_isolation;
    +-----------------------+-----------------+
    | @@GLOBAL.tx_isolation | @@tx_isolation  |
    +-----------------------+-----------------+
    | REPEATABLE-READ       | REPEATABLE-READ |
    +-----------------------+-----------------+
    

    I have not changed or configured the transaction isolation level within hibernate.cfg.xml or anywhere within my application. From the app, I use the following code to print configuration:

    DatabaseMetaData meta = getSession().connection().getMetaData();
    System.out.println("Default Tx Isolation: " + meta.getDefaultTransactionIsolation());
    System.out.println("Current Tx Isolation: " + getSession().connection().getTransactionIsolation());
    

    And I get the following results:

    Default Tx Isolation: 2 (=READ_COMMITTED)
    Current Tx Isolation: 4 (=REPEATABLE_READ)
    

    So, my questions are the following:

    1. Where did the "2" value came from? Since the default is the REPEATABLE_READ, why getDefaultTransactionIsolation() returns READ_COMMITTED?
    2. What is the isolation level that hibernate uses after all? REPEATABLE_READ or READ_COMMITTED?
    3. I thought that when no isolation level is set, hibernate should use the underlying database's default. Is this true? Maybe the jbdc driver implementation sets a default on its own and hibernate uses this?

    解决方案

    looks like meta.getDefaultTransactionIsolation()); is hardcoded in the implementation of DatabaseMetaData in the mysql driver

    public class DatabaseMetaData implements java.sql.DatabaseMetaData lines....

    
    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    }
    

    so i'd bet and trust getSession().connection().getTransactionIsolation()

    这篇关于如果未明确设置,hibernate使用的默认隔离级别是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆