在eclipselink

时间:2015-07-25 13:07:09

标签: jpa eclipselink isolation-level

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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