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

时间:2015-02-05 05:55:42

标签: jpa eclipselink transactional transaction-isolation read-uncommitted

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

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

  

@Transactional(propagation = Propagation.REQUIRES_NEW)

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

  

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

抛出异常--InvalidIsolationLevelException,说"标准JPA不支持自定义隔离级别 - 为JPA实现使用特殊的JpaDialect"。

能帮助我实施JpaDialect吗?我正在使用Eclipse Link 2.5.1。

或者,我可以在开始新交易之前关闭第一笔交易吗?由于First事务处理已关闭,因此Second读取First Transaction提交的数据没有问题。

1 个答案:

答案 0 :(得分: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覆盖方法以适应事务中隔离级别的更改。

    您可以参考描述Hibernate实现的here,可以尝试类似于EclipseLink。