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

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



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



这将引发异常-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重写方法来适应更改,以实现事务中的隔离级别。

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

    10-12 16:24