2

我正在使用 node.JS 服务器进行我正在处理的测试项目,该测试项目涉及用户通过手机上的应用程序连接到站点,并根据使用的 URL,将该数据添加到文档中以供以后访问(并不特别重要,因为访问数据的一半是由单个进程例行完成的)。但是来自多个来源的数据的写入让我担心,如果两个用户要同时连接,(为了讨论,我们会说完全相同的勾号)。文件会发生什么?会有数据损坏/丢失吗?如果是这样,防止它/规避这种情况的最佳方法是什么(即设置一个进程等待另一个进程)。由于数据将根据数据中的信息添加到文档中的特定位置,我担心可能会有一些数据覆盖/丢失。

最终我要问的问题是,如果两个用户同时尝试编辑同一个文档,会发生什么,我该如何防止呢?

PS我无法自己测试这个,因为我没有最好的设置,但不管我不能重现它,它肯定会发生。

编辑:最重要的是,如果他们在读取数据时尝试添加数据,我怎么能防止自动进程阻止用户输入?

编辑 2:文件使用默认的 Express 设置作为单个文本文档存储在 ./routes 目录中。

抢先编辑:(笑)。一切都在 Windows 8 64bit 上运行,如果这有所作为,我想它可以。

4

1 回答 1

1

有许多不同的策略来处理冲突的编辑。使用哪个取决于很多事情,包括您正在使用的基础设施(例如数据存储的类型)、冲突的频率、是否需要保存两个编辑、是否可以使用锁定系统等。 ..无论如何,这里有一些可能的策略:

  1. 更改前锁定。 在编辑之前,要求用户“锁定”资源,当资源被锁定时,不允许任何其他用户尝试编辑它。如果客户端从不释放锁(例如超时),您将不得不发明一些使锁过期的方法。

  2. 更新期间锁定。检索/保存时的版本检查。 拒绝在冲突期间发生的编辑。当客户获得他们想要编辑的版本时,它也会获得一个版本号。提交编辑时,它还提交它认为它编辑的版本号。如果存储库中的版本已更改,则可能发生了冲突编辑,并且可以拒绝编辑。

  3. 更新期间锁定。检索/保存时的版本检查。 合并在冲突期间发生的编辑。当客户获得他们想要编辑的版本时,它也会获得一个版本号。提交编辑时,它还提交它认为它编辑的版本号。如果存储库中的版本已经更改,则可能发生了冲突编辑,服务器可以尝试合并编辑,或者如果合并失败,则可以拒绝编辑。

  4. 更新期间锁定。检索/保存时的版本检查。 在冲突期间保存两个版本。当客户获得他们想要编辑的版本时,它也会获得一个版本号。提交编辑时,它还提交它认为它编辑的版本号。如果存储库中的版本已更改,则可能发生了冲突的编辑,并且可以保存两个编辑的版本。(如果两个客户端试图将冲突的编辑保存到同一个笔记,这就是 EverNote 所做的)。


必须对您的数据存储进行读取和写入,这样它们就不会被希望更改数据的其他客户端中断(同时读取是可以的,但在任何其他读取或写入过程中的任何写入都是不可行的)。根据您使用的数据存储类型,也有许多可能的策略。

对于文件系统读/写,您可以使用文件打开权限来授予您对文件的独占访问权限,然后您可以实施适当的错误处理,以便在资源可用时重试对当前不可用资源的请求。

这篇文章可能有用:node.js readfile woes

还有许多可用于 node.js 的文件锁定模块。这是一个一个

于 2015-04-13T04:54:02.503 回答