jpa - 如何在 @Transactional "READ_UNCOMMITTED"中设置隔离级别。我正在使用 EclipseLink 2.5.1-RC1

标签 jpa eclipselink transactional transaction-isolation read-uncommitted

我需要在正在进行的事务中启动新事务,以便第二个事务中的异常只会回滚新事务而不是旧事务。

这是我通过在第二个事务中设置传播属性来做的,如下所示:

@Transactional(propagation = Propagation.REQUIRES_NEW)



这创建了一个新事务,但新事务需要读取第一个事务的一些未提交数据(脏读),并更新该数据。我试图通过将隔离属性设置为:

@Transactional(propagation = Propagation.REQUIRES_NEW, isolation=Isolation.READ_UNCOMMITTED)



这将引发异常 - InvalidIsolationLevelException,表示“标准 JPA 不支持自定义隔离级别 - 为您的 JPA 实现使用特殊的 JpaDialect”。

任何人都可以帮助我实现 JpaDialect 吗?我正在使用 Eclipse Link 2.5.1 。

或者我可以在开始新交易之前如何关闭第一笔交易?由于第一个事务已关闭,因此第二个事务读取第一个事务提交的数据没有问题。

最佳答案

  • 在 JPA 中,您可以尝试这样的事情,但不确定如何在 EclipseLink/Spring 中实现类似的目标。

    但整体概念可能保持不变,获取底层数据库连接并设置适当的隔离级别。
    java.sql.Connection connection = entityManager.unwrap(java.sql.Connection.class);
    connection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED); 
    //-- Or with some other constant something like Isolation.READ_UNCOMMITTED
    

    之后,您可能还想将隔离级别重置回默认值。
  • 如果您不想进行更改,则可能需要实现 JpaDialect覆盖方法以适应事务中隔离级别的更改。

    您可以引用here它描述了 Hibernate 的实现,可以尝试类似的 EclipseLink。
  • 关于jpa - 如何在 @Transactional "READ_UNCOMMITTED"中设置隔离级别。我正在使用 EclipseLink 2.5.1-RC1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28337106/

    相关文章:

    java - 如何在spring上正确地从file.properties设置hibernate?

    java - 如何使用 Maven 在带有远程 persistence.xml 的 eclipseLink 中启用静态编织?

    java - 将 PostgreSQL Query 转换为对应的 Hibernate Query

    java - 事务未在 Spring + Hibernate + JPA 设置中创建

    java - 检查 ElementCollection 映射是否有匹配的条目

    java - 即使定义了超时,Postgres JDBC 线程仍停留在 java.net.SocketInputStream.socketRead0 上

    java - JPA 外键 OneToMany

    java - @Transactional 不适用于 spring 和 hibernate(如果没有 Activity 事务,get 无效)

    java - 回滚时的 Spring 事务不会将数据库恢复到以前的状态

    java - Spring @Transactional 和继承