当前位置: 首页 > 知识库问答 >
问题:

在eclipselink中设置隔离级别

宇文鸿振
2023-03-14

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

>

  • java.sql.连接

    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
    

    Database aseLogin 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
    

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

    我正在使用Application范围的EntityManager、JPA 2.0、Eclipse Link 2.5.2。
    如果有更可取的方式设置事务隔离,请告诉我。

  • 共有2个答案

    夏俊人
    2023-03-14

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

    仅仅创建一个新的数据库登录实例并不能让您访问持久化单元正在使用的设置。您需要获得EntityManager/EMF下的会话使用的数据库登录。

    陶柏
    2023-03-14

    在使用eclipse link稍作停顿后,我终于找到了如何设置事务隔离级别。
    正如@Chris在他的回答中正确提到的那样,我需要获取会话使用的数据库登录。经过对eclipse链接会话的小研究,我发现我可以在自己的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"/>
    
     类似资料:
    • 问题内容: 我想将隔离级别设置为。如何使用gorm orm for postgres实现此目的。 示例代码: 问题答案: 我在这里有完全一样的问题: 和pg完全一样。

    • 在标准/自定义kafkaconnect接收器中,我们如何指定它应该只使用来自kafka主题的read_comitted消息。我可以在这里看到配置,但看不到任何选项(除非这是默认行为)。谢了。https://docs . confluent . io/current/installation/configuration/connect/sink-connect-configs . html

    • 我正在写一个小拍卖app,这是非常重要的,我的出价是有把握的记录。毕竟,拍卖的最后几秒钟是买家的关键时刻,我不能冒险让他们同时出价和竞争。 当然,这就是事务隔离的目的。我可以将我的隔离级别设置为可序列化,然后我们就都设置好了。 但是其他的请求呢?如果用户正在查看配置文件或发送消息,则这些请求不需要任何接近那种事务隔离的地方。对于这些请求,“已提交读”隔离级别是完全可以接受的。 我正在将事务级别设置

    • 问题内容: 也许有人可以帮助我解决Spring(3.1)/ Postgresql(8.4.11)中的事务性问题 我的交易服务如下: Spring配置Webapp包含: 让我们说一个请求“ x”和一个请求“ y”同时执行并到达注释“比较”(方法insertObject)。然后,允许他们两个都插入一个新对象,并提交他们的事务。 为什么我没有RollbackException?据我所知,这就是可序列化等

    • 我正在使用Wildfly 13和MS SQLServer数据库(sqljdbc驱动程序4.0.0) 我正在尝试为Wildfly创建的连接设置事务隔离。 本地数据源配置为 但是所有连接都是使用默认事务隔离级别(TRANSACTION_READ_COMMITTED)创建的,并且永远不会更改。 任何关于可能出错的想法。 谢谢

    • 在我的airflow升级到2.0.0(然后是2.0.1)并且调度程序扩展到3个节点之后,奇怪的事情发生了: DAGRUNN成功,但根本没有计划任务实例 任务失败,主机名为空(https://github.com/apache/airflow/issues/13692) 任务设置为“upstream_failed”,而上游任务成功(https://github.com/apache/airflow/