【问题标题】:Pessimistic Lock doesn't work悲观锁不起作用
【发布时间】:2013-09-12 10:47:33
【问题描述】:

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

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

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

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

我哪里错了?

【问题讨论】:

  • 如何将浏览器代码封装在事务中?会不会是你的第一笔交易在其他浏览器尝试获取锁之前被释放?
  • 你能解释得更好吗?我正在使用类似 Spring 的应用程序容器和类似 UI 框架的 vaadin
  • 悲观锁需要 EntityManager 与事务相关联,正如下面的答案中提到的,锁仅在事务的生命周期内保持。看看你是如何获取 em 的,它是如何与事务关联的,以及它何时回滚/提交,与其他线程可能获取它们的锁的时间相比

标签: java jpa eclipselink


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    对于一般情况:

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

    【讨论】:

    • 是的,从其他窗口/浏览器我做了同样的事情(获取 PESSIMISTIC_WRITE)锁。我正在使用 Oracle 10g
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 2010-09-12
    相关资源
    最近更新 更多