混合乐观/悲观锁

时间:2014-06-19 13:47:39

标签: java jpa concurrency optimistic-locking pessimistic-locking

申请

您好,

我们有一个应用程序(J2EE / Hibernate / JPA),有几个用户在公共实体上进行操作。

为了简化,我们假设此应用程序类似于 Google文档多个用户可以同时更新共享文档

我们选择了optmistic lock来处理并发:

  • 句子单独的实体
  • 低概率多个用户将在同时更新相同的句子
  • 在这种情况下,其中一个用户可以收到消息“抱歉其他用户试图编辑同一句话”

后台流程

到目前为止,非常好。

但是现在,我们已将后台进程(非常快)添加到此应用程序中。 他们定期进行更改(假设它替换了另一个词的任何出现)。

这些工作失败确定。他们的任务并不紧急,他们可以在下次(10秒后)尝试相同的任务。

在这种情况下乐观锁定的问题是,现在单个用户无法再对整个文档执行长动作

实际上,如果用户更改整个文档的字体(在所有句子上),并且此操作需要一段时间(> 10秒),那么在此期间后台进程将< strong>更改一些单词,并且更长的操作(=用户操作:更改字体)将在并发访问时失败。

这是不可接受的向用户显示此消息:“您的操作失败,因为某些技术进程同时运行”。

由于后台流程可以稍后重试,我们宁愿让它失败。

问题

我们如何在乐观锁定方法中为某些行为 / actors设置悲观锁定?

潜在解决方案

为了保持用户的乐观approch,我们考虑了以下解决方案:

  • 创建一个“用户操作”标记,该标记将在任何用户的任何操作期​​间设置
  • 在此标志为“关闭”之前,作业不会启动
  • 在任何正在运行的进程结束时,检查该标志是否已打开:如果是,请取消此操作/回滚。

这样,进程只能在空闲时运行,而用户却没有做任何事情。

帮助

这是一个好方法吗? 我们找不到关于混合类型锁的良好实践的任何文章/讨论。

1 个答案:

答案 0 :(得分:1)

对于&#34;文件&#34;这是读写锁定的典型案例

读写锁的工作原理是,多个读者可以并行锁定资源,但只能锁定一个编写器。因此,读者和作者是相互排斥的。

您的真实用户会将&#34;读取&#34;当他们开始编辑时锁定到文档。其中不止一个可以同时进入,每个人都会编辑不同的句子。

在这种情况下,您的后台进程是作者,如果没有读者(没有其他编写者)锁定此文档,它可以输入(通过输入&#34;写&#34;锁定)。然后后台进程可以进行更改。

此外,可能会发生用户无法打开文档的情况,但是 - 由于后台处理速度很快 - 这种情况很不可能(并且它是暂时的,您可以在1秒后重试,即使没有通知用户)。

为了向您提供一些参考,以下是如何在JPA中使用LockModeType.READLockModeType.WRITERead-Write lockings in JPA