0

我目前正在定制一个名为Atlassian Confluence的内容管理系统。如何同步2个线程进行数据库提交?

在此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社区的内容管理系统专家请求提供建议。

+0

这个问题似乎是题外话题,因为它是关于Confluence。 – bmargulies

回答

0

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

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

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

感谢,苏尼尔

-1

第一:这应该通过正确的数据库来处理,如果处理不当,这是CMS的一个bug,而不是你的代码。

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