我想使用 eclipse 链接设置隔离级别,
我尝试了这两种方法来做到这一点:
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
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/