jakarta-ee - JavaEE : 'SELECT FOR UPDATE NOWAIT' without marking the JTA transaction for rollback when fails?

标签 jakarta-ee jpa locking jta

我正在尝试在 JavaEE 中使用“SELECT FOR UPDATE NOWAIT”(使用 JPA)。我是这样做的:

props.put("javax.persistence.lock.timeout", 0);
em.find(MyEntity.class, id, LockModeType.PESSIMISTIC_READ, props);

除一件事外一切顺利:如果失败(无法获取锁),则抛出 PessimisticLockException 而不是 LockTimeoutException(如果设置了任何其他正超时则抛出),这会导致事务 ( JTA 事务)标记为回滚。

我试过使用原生查询,但它产生了相同的结果。
我将 Weblogic 12.1 与 EclipseLink 一起使用(也尝试了 TopLink,没有区别)。

有什么方法可以在执行失败时执行“SELECT FOR UPDATE NOWAIT”而不将 JTA 事务标记为在 JavaEE 中回滚?

最佳答案

请记录错误并为其投票。

您可能可以通过创建自己的 OraclePlatform 子类并覆盖 isLockTimeoutException() 来修复它。

您还可以将查询作为 DatabaseQuery 执行以避免回滚。

em.unwrap(Session.class).executeQuery(((JpaQuery)query).getDatabaseQuery())

关于jakarta-ee - JavaEE : 'SELECT FOR UPDATE NOWAIT' without marking the JTA transaction for rollback when fails?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13688447/

相关文章:

java - JPA JOIN 查询列表仅给出一项而不是所有项

java - "compose"在并发上下文中意味着什么?

用于防止重复订单的 Java 同步选项(文件、数据库锁定?)

java - Netbeans 6.9.1 上的 Sun Java System 应用服务器

multithreading - ServerEndpoint 的每个方法是否由不同的线程执行?

java - JSF 国际化 f :loadbundle or through faces-config: Performance point

java - Spring 3.1 和 Servlet API 3.0。 @WebServlet 注解的使用方法

java - 如何在 SpringBootTest 集成测试期间保留实体

Spring-JPA : updating parent Entity fails to persist new child Entities, 将它们解释为 Transient

mysql - 无法检查 MySQL 中的行状态(锁定或未锁定)