我要求在正在进行的事务中启动新事务,以便第二个事务中的异常将仅回滚新事务,而不回滚旧事务。
我这样做是通过在第二个事务中设置传播属性来实现的,如下所示:
这创建了一个新的事务,但是新的事务需要读取第一个事务的一些未提交的数据(脏读),并更新该数据。我正在尝试通过将隔离属性设置为:
这将引发异常-InvalidIsolationLevelException,说“标准JPA不支持自定义隔离级别-为您的JPA实现使用特殊的JpaDialect”。
有什么可以帮助我实现JpaDialect的吗?我正在使用Eclipse Link 2.5.1。
或者我可以在开始新交易之前如何关闭第一笔交易?由于第一个事务已关闭,因此第二个将毫无问题地读取由第一个事务提交的数据。
最佳答案
但是总体概念可能保持不变,获得基础数据库连接并设置适当的隔离级别。
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/