5

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

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

@Transactional(传播=传播.REQUIRES_NEW)

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

@Transactional(传播=传播.REQUIRES_NEW,隔离=隔离.READ_UNCOMMITTED)

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

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

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

4

1 回答 1

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 的实现,可以尝试类似的 EclipseLink。

于 2015-02-05T13:04:53.523 回答