在 eclipselink 中设置隔离级别

Set Isolation level in eclipselink

我想使用 eclipse 设置隔离级别 link,
我尝试了这两种方法:

  1. java.sql.Connection

    mgr = EMF.get().createEntityManager();
    tx = mgr.getTransaction();
    tx.begin();
    
    java.sql.Connection connection = mgr.unwrap(java.sql.Connection.class);
    connection.setTransactionIsolation(java.sql.Connection.TRANSACTION_READ_COMMITTED);
    System.out.println("Connection: "+connection.getTransactionIsolation());
    //prints TRANSACTION_READ_COMMITED as expected
    
    org.eclipse.persistence.sessions.DatabaseLogin databaseLogin = new DatabaseLogin();
    System.out.println("DatabaseLoging: "+databaseLogin.getTransactionIsolation());
    //prints -1, representing transaction isolation is not set
    
  2. DatabaseLogin setTransationIsolation method

    mgr = EMF.get().createEntityManager();
    tx = mgr.getTransaction();
    tx.begin();
    
    org.eclipse.persistence.sessions.DatabaseLogin databaseLogin = new DatabaseLogin();
    databaseLogin.setTransactionIsolation(DatabaseLogin.TRANSACTION_READ_COMMITTED);
    System.out.println("DatabaseLoging: "+databaseLogin.getTransactionIsolation());
    //prints TRANSACTION_READ_COMMITED as expected
    
    java.sql.Connection connection = mgr.unwrap(java.sql.Connection.class);
    System.out.println("Connection: "+connection.getTransactionIsolation());
    //prints TRANSACTION_REPEATABLE_READ
    

如您所见,getTransacationIsolation() 方法的 return 值之间存在一些不一致。我的问题是,在这两种情况下真正设置了哪种事务隔离?我知道 eclipse link 默认使用不同的连接进行读写操作,DatabaseLogin.setTransactionIsolation 应该为两个连接设置隔离级别,所以为什么 Connection.getTransactionIsolation 仍然 return 另一个隔离级别 ?

我正在使用应用程序范围的 EntityManager、JPA 2.0、EclipseLink 2.5.2。
如果有更好的方式设置事务隔离,请告诉我。

databaseLogin class 是一个内部对象,EclipseLink 使用它来配置访问数据库的方式,以及用于配置这些连接的设置。您直接对连接所做的任何更改都不会反映在 DatabaseLogin 实例中。

只是创建一个新的 DatabaseLoging 实例不会让您访问持久性单元正在使用的设置。您需要获取 EntityManager/EMF 下的会话正在使用的 DatabaseLogin。

在使用 eclipse link 稍作停顿后,我终于找到了如何设置事务隔离级别。
正如@Chris 在 中正确提到的那样,我需要获得会话使用的 DatabaseLogin。在对我发现的 eclipse link 会话进行小规模研究后,我可以在自己的 SessionCustomizer 中更改 Session 属性,请参见下面的代码:

package com.filip.blabla;
import org.eclipse.persistence.sessions.DatabaseLogin;
import org.eclipse.persistence.sessions.Session;
import org.eclipse.persistence.sessions.factories.SessionCustomizer;

public class DFSessionCustomizer implements SessionCustomizer {
        @Override
        public void customize(Session session) throws Exception {
            DatabaseLogin databaseLogin = (DatabaseLogin) session.getDatasourceLogin();
            databaseLogin.setTransactionIsolation(DatabaseLogin.TRANSACTION_READ_COMMITTED);
        }

}

在 persistence.xml

中设置 SessionCustomizer
<property name="eclipselink.session.customizer" value="com.filip.blabla.DFSessionCustomizer"/>