我要求在正在进行的事务中启动新事务,以便第二个事务中的异常只回滚新事务而不是旧事务。
我这样做是通过在第二个事务中设置传播属性,如下所示:
@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提交的数据没有问题。
答案 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。