您好,
我们有一个应用程序(J2EE / Hibernate / JPA),有几个用户在公共实体上进行操作。
为了简化,我们假设此应用程序类似于 Google文档: 多个用户可以同时更新共享文档。
我们选择了optmistic lock来处理并发:
到目前为止,非常好。
但是现在,我们已将后台进程(非常快)添加到此应用程序中。 他们定期进行更改(假设它替换了另一个词的任何出现)。
这些工作失败确定。他们的任务并不紧急,他们可以在下次(10秒后)尝试相同的任务。
在这种情况下乐观锁定的问题是,现在单个用户无法再对整个文档执行长动作。
实际上,如果用户更改整个文档的字体(在所有句子上),并且此操作需要一段时间(> 10秒),那么在此期间后台进程将< strong>更改一些单词,并且更长的操作(=用户操作:更改字体)将在并发访问时失败。
这是不可接受的向用户显示此消息:“您的操作失败,因为某些技术进程同时运行”。
由于后台流程可以稍后重试,我们宁愿让它失败。
我们如何在乐观锁定方法中为某些行为 / actors设置悲观锁定?
为了保持用户的乐观approch,我们考虑了以下解决方案:
这样,进程只能在空闲时运行,而用户却没有做任何事情。
这是一个好方法吗? 我们找不到关于混合类型锁的良好实践的任何文章/讨论。
答案 0 :(得分:1)
对于&#34;文件&#34;这是读写锁定的典型案例。
读写锁的工作原理是,多个读者可以并行锁定资源,但只能锁定一个编写器。因此,读者和作者是相互排斥的。
您的真实用户会将&#34;读取&#34;当他们开始编辑时锁定到文档。其中不止一个可以同时进入,每个人都会编辑不同的句子。
在这种情况下,您的后台进程是作者,如果没有读者(没有其他编写者)锁定此文档,它可以输入(通过输入&#34;写&#34;锁定)。然后后台进程可以进行更改。
此外,可能会发生用户无法打开文档的情况,但是 - 由于后台处理速度很快 - 这种情况很不可能(并且它是暂时的,您可以在1秒后重试,即使没有通知用户)。
为了向您提供一些参考,以下是如何在JPA中使用LockModeType.READ
和LockModeType.WRITE
:Read-Write lockings in JPA