0

我目前正在定制一个名为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 社区的内容管理系统专家提供建议。

4

2 回答 2

0

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

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

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

谢谢, 苏尼尔

于 2013-11-15T05:27:45.050 回答
-1

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

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

于 2013-11-16T12:26:48.977 回答