javascript - 当两个用户正在编辑同一个文件时,node js 如何防止数据损坏?

标签 javascript node.js corruption data-loss

<分区>

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

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

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

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

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

抢先编辑:(笑)。一切都在 windows 8 64 位上运行,如果这有所不同,我想它可以。

最佳答案

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

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

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

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

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


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

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

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

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

关于javascript - 当两个用户正在编辑同一个文件时,node js 如何防止数据损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29597197/

相关文章:

javascript - 访问未知对象名称中的数据

c++ - 如何从 QTableWidgetItem 中提取显示的文本?

javascript - Firefox Add-on Builder 扩展调试

javascript - 单击下拉菜单中的 p 元素后获取图像的 id

javascript - 在 Javascript 中快速检查 2000 个复选框的方法?

node.js - 错误: Cannot find module '../lib/utils/unsupported.js' on window10

javascript - 带有 $lookup 的 Mongo 聚合和 $group 嵌套数组

Cassandra 1.1 或 1.2 用于生产用途?

c++ - C++、cin、cout、threads 和 sync_with_stdio 的损坏输出

javascript - React 中 OTP 输入字段的第一个输入自动对焦