我正在用JPA2.1开发一个应用程序。我有后续的麻烦。
我试图用这样的方式锁定一个实体:
Book book = em.find(Book.class, 12);
em.lock(book, LockModeType.PESSIMISTIC_WRITE);
但是,如果尝试使用id=12从另一个窗口浏览器或客户端访问实体,系统就不会抛出PessimisticLockException?
我哪里错了?
发布于 2013-09-12 11:21:20
锁在事务的生存期内是有效的,但肯定不会跨越多个请求响应循环(除非您已经将实体管理器和事务管理器配置为管理长时间事务)。
事务必须是一个短期活动对象(出于性能原因)。
乐观写锁意味着book
不会被lock
指令和事务结束之间的任何其他线程修改。当然,书中的对象本身也可能活得更长。
发布于 2013-09-12 11:24:03
我想,在另一个窗口/浏览器中,您会尝试同样的方法:获取一个PESSIMISTIC_WRITE锁。
您所遇到的问题是,当方法返回时(事务结束时),锁就会释放,这意味着当您打开第二个浏览器/窗口时,就没有锁了。
您可能应该解释一下您想要解决/测试的问题/场景。
对于一般情况:
另一个可能的原因可能是数据库表不支持行级锁定。例如,在MySql中,只有InnoDB存储引擎支持"SELECT * For“( PESSIMISTIC_WRITE锁被转换为该更新)。
https://stackoverflow.com/questions/18762154
复制相似问题