如何同步2个执行数据库提交的线程?

时间:2013-11-15 05:04:41

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

我目前正致力于自定义名为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个或更多版本。

如何在我们的系统上修复此问题?有什么可以做的,以防止提交重复版本?

我要求stackoverflow社区的内容管理系统专家请提供建议。

2 个答案:

答案 0 :(得分:0)

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

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

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

谢谢,Sunil

答案 1 :(得分:-1)

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

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