Noo*_*han 5 jpa transactional eclipselink transaction-isolation read-uncommitted
我需要在正在进行的事务中启动新事务,以便第二个事务中的异常只会回滚新事务而不是旧事务。
这是我通过在第二个事务中设置传播属性来做的,如下所示:
@Transactional(传播 = 传播.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
Run Code Online (Sandbox Code Playgroud)
之后,您可能还想将隔离级别重置回默认值。
如果您不想进行更改,那么您可能需要实现JpaDialect重写方法来适应事务中隔离级别的更改。
你可以参考这里描述Hibernate的实现,可以尝试类似的EclipseLink。
| 归档时间: |
|
| 查看次数: |
11578 次 |
| 最近记录: |