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