Hibernate SessionFactory,动态设置TransactionIsolationLevel

Hibernate SessionFactory, setTransactionIsolationLevel on the fly

所以,

休眠 SessionFactory 可用。

现在,在 java.sql.Connection 上有一个方法 connection.setTransactionIsolation

现在,您可以从 sessionFactory openSession()getCurrentSession()

从那里,我们可以做:

session.doWork(connection -> { ... connection.setTransactionIsolation ... } )

然而,我的记忆告诉我这已经太迟了。

实际上可能需要在 Session 创建之前执行 connection.setTransactionIsolation

这不是真的吗?

此外,setReadOnly也有相同的要求。

现在,要在创建会话之前获取连接,有以下答案:

但这需要 datasource.

那么有没有一个可以从 SessionFactory 得到 datasource,所以我可以从我目前拥有的创建这个逻辑?

编辑

敬请注意,请勿说出 S.P.R.I.N.G 或 A.N.N.O.T.A.T.I.O.N.S。

“事务隔离”属性 具有“连接”级别,这就是为什么您必须在创建连接后应用它,而不是在事务级别或(如所有连接的一般规则)在 SessionFactory 上.

考虑到您要执行的操作,您实际上有两种不同的选项来设置事务隔离。

最常用、最干净、最推荐的方法是设置特定的休眠模式 属性,如下所示:

<property name="hibernate.connection.isolation">2</property>

具体情况下,值2对应“READ COMMITTED”。

否则,您可以尝试从 Session 获取连接实例,如以下代码:

Session session = sessionFactory.getSession();

try {
    session.connection().setTransactionIsolation(2);
} catch (HibernateException | SQLException e) {
    e.printStackTrace();
}

请记住,以上是一种非常肮脏的方法,并且不能保证它有效。此外,org.hibernate.Session 的方法 connection() 已弃用,因此您不应使用它。

然而,我个人用于一些单元测试(作为实验)并且效果很好。