我正在使用 JPA2.1 开发应用程序。我有以下麻烦。
我正在尝试以这种方式锁定实体:
Book book = em.find(Book.class, 12);
em.lock(book, LockModeType.PESSIMISTIC_WRITE);
但是如果尝试从另一个 Windows 浏览器或客户端访问 id=12 的实体,系统不会抛出 PessimisticLockException?
我哪里错了?
我正在使用 JPA2.1 开发应用程序。我有以下麻烦。
我正在尝试以这种方式锁定实体:
Book book = em.find(Book.class, 12);
em.lock(book, LockModeType.PESSIMISTIC_WRITE);
但是如果尝试从另一个 Windows 浏览器或客户端访问 id=12 的实体,系统不会抛出 PessimisticLockException?
我哪里错了?
锁定将在事务的生命周期内有效,但肯定不会跨多个请求-响应循环(除非您已将实体管理器和事务管理器配置为管理长时间事务)。
事务必须是一个短期活动对象(出于性能原因)。
乐观写锁意味着在指令和事务结束book
之间不会被任何其他线程修改。lock
当然,书本本身的寿命可能会更长。
我想在另一个窗口/浏览器中你尝试同样的事情:获取 PESSIMISTIC_WRITE 锁。
您遇到的问题是,当方法返回时(事务结束),锁被释放,这意味着当您打开第二个浏览器/窗口时,不再有锁。
您可能应该向我们解释您想尝试解决/测试的问题/场景。
对于一般情况:
另一个可能的原因可能是您的数据库表不支持行级锁定。例如,在 MySql 中,只有 InnoDB 存储引擎支持“SELECT * FOR UPDATE”(将 PESSIMISTIC_WRITE 锁翻译成它)。