当前位置: 首页 > 面试题库 >

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

霍建柏
2023-03-14
问题内容

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

问题答案:

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



 类似资料:
  • 本文向大家介绍MySQL的默认事务隔离级别是?相关面试题,主要包含被问及MySQL的默认事务隔离级别是?时的应答技巧和注意事项,需要的朋友参考一下 读未提交(RU): 一个事务还没提交时, 它做的变更就能被别的事务看到. 读提交(RC): 一个事务提交之后, 它做的变更才会被其他事务看到. 可重复读(RR): 一个事务执行过程中看到的数据, 总是跟这个事务在启动时看到的数据是一致的. 当然在可重复

  • 问题内容: 我想将隔离级别设置为。如何使用gorm orm for postgres实现此目的。 示例代码: 问题答案: 我在这里有完全一样的问题: 和pg完全一样。

  • 我想使用eclipse链接设置隔离级别,我尝试了以下两种方法: > java.sql.连接 Database aseLogin setTransationIsolation方法 如您所见,getTransactionSolation()方法的返回值之间存在一些不一致。我的问题是,在这两种情况下真正设置了哪种事务隔离?我知道eclipse链接在默认情况下使用不同的连接进行读写操作,即Database

  • 在标准/自定义kafkaconnect接收器中,我们如何指定它应该只使用来自kafka主题的read_comitted消息。我可以在这里看到配置,但看不到任何选项(除非这是默认行为)。谢了。https://docs . confluent . io/current/installation/configuration/connect/sink-connect-configs . html

  • 假设我们使用自动提交模式,即:。 默认情况下(没有BEGIN),PostgreSQL以“自动提交”模式执行事务,即每个语句都在自己的事务中执行,并在语句末尾隐式执行提交(如果执行成功,否则回滚完成)。 然后,使用读取提交的隔离级别(在 postgresql 中也是缺省值),该语句是实际的隔离单元。但在这里,这句话只意味着外在的陈述?同一外部语句中嵌入的语句呢? CTE(带查询) 我测试了一些情况,