【问题标题】:How do you synchronize 2 threads doing database commits?您如何同步执行数据库提交的 2 个线程?
【发布时间】:2013-11-15 05:04:40
【问题描述】:

我目前正在定制一个名为Atlassian Confluence 的内容管理系统。

在此 CMS 中,您可以创建/编辑页面以及将文件上传到页面并进行渲染(如图像或 ms office 文档)。

如果您创建一个页面,然后对其进行 10 次编辑(单击“编辑”,输入一些新文本,单击“保存”10 次),CMS 将创建同一页面的 10 个以上版本。所以你基本上永远不会失去任何东西。

但是,我注意到这个产品偶尔会创建 2 个,有时是 3 个新版本,只有一个编辑!所以当然我一直在谷歌上搜索并发现报告了类似的问题:

https://jira.atlassian.com/browse/CONF-13480

https://jira.atlassian.com/browse/CONF-10662

https://jira.atlassian.com/browse/CONF-18970

https://jira.atlassian.com/browse/CONF-9857

https://jira.atlassian.com/browse/CONF-16732

https://jira.atlassian.com/browse/CONF-18970

如果我听到人们所说的正确 - 数据库事务中有 2 个或更多线程在做同样的事情。在一个提交到数据库之前,这些线程不能互相看到。但由于某种原因,另一个线程不会停止并进行第二次提交 - 所以你最终会得到同一页面编辑的 2 个或更多版本。

如何在我们的系统上解决这个问题?有什么办法可以防止重复版本被提交?

我正在向 stackoverflow 社区的内容管理系统专家寻求建议。

【问题讨论】:

  • 这个问题似乎跑题了,因为它是关于 Confluence 的。

标签: java multithreading oracle11g content-management-system request


【解决方案1】:

我觉得这个问题需要在发出 SAVE 请求时处理,而不是在提交到数据库线程时处理。

我不是 CMS 专家,但您需要在没有更改或“保存”请求已发送时停止保存编辑。

这可能涉及使用标记变量来指示对内容的任何更改,并仅在有新更改时才允许保存。否则禁用“保存”按钮或忽略保存请求。

谢谢,苏尼尔

【讨论】:

    【解决方案2】:

    首先:这应该由数据库正确处理,如果处理不当,这是CMS的错误,而不是您的代码。

    也就是说:作为该错误的解决方法,您需要创建一个访问数据库的瓶颈线程,而所有外部线程都不与数据库通信,而是将所有请求交给这个人工瓶颈。然后,该线程需要使用 LinkedBlockingQueue 之类的构造来确保一次只写入一个请求(然后应由 CMS 处理重复检查)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-06
      • 1970-01-01
      • 2019-02-27
      • 2017-04-11
      相关资源
      最近更新 更多