悲观锁不起作用

时间:2013-09-12 10:47:34

标签: java jpa eclipselink

我正在使用JPA2.1开发一个应用程序。我遇到了麻烦。

我正试图以这种方式锁定一个实体:

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

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

我哪里错了?

2 个答案:

答案 0 :(得分:2)

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

交易必须是一个短时间的生活对象(出于性能原因)。

乐观写锁意味着book指令和事务结束之间的任何其他线程都不会修改lock。但书本对象本身可能活得更长。

答案 1 :(得分:0)

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

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

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

对于一般情况:

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