在eclipselink中设置隔离级别 [英] Set Isolation level in eclipselink

查看:135
本文介绍了在eclipselink中设置隔离级别的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I would like to set isolation level using eclipse link,
I tried these 2 ways to do it:

  1. java.sql.Connection

  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

  • 数据库登录setTransationIsolation方法

    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仍返回另一个隔离级别?

    As you can see there are some inconsistencies between the return values of getTransacationIsolation() method. My question is, which transaction isolation is really set in both cases ? I know that eclipse link uses different connection for read and write operations by default, DatabaseLogin.setTransactionIsolation should set the isolation level for both connections, so why Connection.getTransactionIsolation still returns another isolation level ?

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

    I am using Application scoped EntityManager, JPA 2.0, EclipseLink 2.5.2.
    If there are more preferable ways setting the transaction isolation, please let me know.

    推荐答案

    使用eclipse链接稍作停顿后,我终于了解了如何设置事务隔离级别.
    正如@Chris在他的答案中正确提及的那样,我需要获取会话使用的DatabaseLogin.在对eclipse链接会话进行小型研究之后,我发现可以在自己的SessionCustomizer中更改Session属性,请参见下面的代码:

    After having a small pause with eclipse link, I finally found out how to set transaction isolation level.
    As @Chris correctly mentioned in his answer I need to obtain DatabaseLogin used by sessions. After a small research on eclipse link sessions I have found out, that I can change the Session properties in my own SessionCustomizer, see the code below:

    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

    set SessionCustomizer in persistence.xml

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

    这篇关于在eclipselink中设置隔离级别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆