2

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

我正在尝试以这种方式锁定实体:

Book book = em.find(Book.class, 12);
em.lock(book, LockModeType.PESSIMISTIC_WRITE);

但是如果尝试从另一个 Windows 浏览器或客户端访问 id=12 的实体,系统不会抛出 PessimisticLockException?

我哪里错了?

4

2 回答 2

2

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

事务必须是一个短期活动对象(出于性能原因)。

乐观写锁意味着在指令和事务结束book之间不会被任何其他线程修改。lock当然,书本本身的寿命可能会更长。

于 2013-09-12T11:21:20.980 回答
0

我想在另一个窗口/浏览器中你尝试同样的事情:获取 PESSIMISTIC_WRITE 锁。

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

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

对于一般情况:

另一个可能的原因可能是您的数据库表不支持行级锁定。例如,在 MySql 中,只有 InnoDB 存储引擎支持“SELECT * FOR UPDATE”(将 PESSIMISTIC_WRITE 锁翻译成它)。

于 2013-09-12T11:24:03.053 回答