Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 悲观锁不起作用_Java_Jpa_Eclipselink - Fatal编程技术网

Java 悲观锁不起作用

Java 悲观锁不起作用,java,jpa,eclipselink,Java,Jpa,Eclipselink,我正在用JPA2.1开发一个应用程序。我有以下的麻烦 我正试图通过以下方式锁定实体: Book book = em.find(Book.class, 12); em.lock(book, LockModeType.PESSIMISTIC_WRITE); 但是,如果尝试从另一个windows浏览器或客户端访问id=12的实体,系统不会抛出悲观锁异常 我错在哪里?锁将在事务的生命周期内有效,但肯定不会跨越多个请求-响应循环,除非您已将实体管理器和事务管理器配置为管理长时间事务 出于性能原因,事务必

我正在用JPA2.1开发一个应用程序。我有以下的麻烦

我正试图通过以下方式锁定实体:

Book book = em.find(Book.class, 12);
em.lock(book, LockModeType.PESSIMISTIC_WRITE);
但是,如果尝试从另一个windows浏览器或客户端访问id=12的实体,系统不会抛出悲观锁异常


我错在哪里?

锁将在事务的生命周期内有效,但肯定不会跨越多个请求-响应循环,除非您已将实体管理器和事务管理器配置为管理长时间事务

出于性能原因,事务必须是短期活动对象


乐观写锁意味着在锁指令和事务结束之间,书本不会被任何其他线程修改。当然,图书对象本身可能会活得更长。

我想在另一个窗口/浏览器中,你也会尝试同样的事情:获得一个悲观的写入锁

您遇到的问题是,当事务结束时方法返回时,锁被释放,这意味着当您打开第二个浏览器/窗口时,不再有锁

您可能应该向我们解释您想要尝试解决/测试的问题/场景

就一般情况而言:


另一个可能的原因可能是数据库表不支持行级锁定。例如,在MySql中,只有InnoDB存储引擎支持将悲观写锁转换为的SELECT*更新。

是的,我在其他窗口/浏览器中也做了同样的事情,获得了悲观写锁。我正在使用Oracle 10G,您如何在事务中包装浏览器代码?这可能是您的第一笔交易在其他浏览器尝试获取锁之前被释放吗?您能更好地解释一下吗?我使用的是类似于Spring的应用程序容器和类似于vaadin的UI框架悲观锁要求EntityManager与事务相关联,正如ben在下面的回答中提到的,锁只在事务的生命周期内保持。查看您是如何获取em的,它是如何与事务关联的,以及它是何时回滚/提交的,与其他线程可能获取其锁的时间相比