jpa - 在 eclipselink 中设置隔离级别

标签 jpa eclipselink isolation-level

我想使用 eclipse 链接设置隔离级别,
我尝试了这两种方法来做到这一点:

  • 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
    
  • 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() 方法的返回值之间存在一些不一致。我的问题是,在这两种情况下确实设置了哪种事务隔离?我知道eclipse链接默认使用不同的连接进行读写操作,DatabaseLogin.setTransactionIsolation应该为两个连接设置隔离级别,那么为什么Connection.getTransactionIsolation仍然返回另一个隔离级别?

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

    最佳答案

    在 eclipse 链接上稍作停顿后,我终于找到了如何设置事务隔离级别。
    正如@Chris 在 his answer 中正确提到的那样我需要获取DatabaseLogin session 使用。在对 Eclipse 链接 session 进行了小规模研究后,我发现我可以更改 Session我自己的房产SessionCustomizer ,看下面的代码:

    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"/>
    

    关于jpa - 在 eclipselink 中设置隔离级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31626773/

    相关文章:

    java - org.hibernate.hql.internal.ast.QuerySyntaxException

    java - JPA脚本生成重复语句

    java - 返回没有 parent 的实体?

    java - 在 JPA Criteria Builder 中按 Oracle 函数排序

    jpa - 即使 EntityManager 已被清除()、关闭()并设置为 null,JAXB 也会急切地获取标记为 FetchType.LAZY 的字段

    jpa - querydsl 将多个查询合二为一

    sql-server - 当另一个事务的事务隔离级别可以使用非冲突过滤器进行序列化时,为什么要插入 SQL 语句 block ?

    c# - 使用 Sql Transaction 和 Isolation Level 进行冗长的读取操作?

    java - EntityManager 嵌套事务原子性

    sql - 事务隔离级别 - 选择正确的隔离级别