我正在使用node.JS服务器进行正在进行的测试项目,该项目涉及用户通过手机上的应用程序连接到该站点,并根据所使用的URL将该数据添加到文档中以便访问以后的时间(由于访问数据的一半是由一个过程例行完成的,因此不是特别重要)。但是从多个来源写入数据让我担心,如果两个用户同时连接,(为了讨论,我们会说完全相同的时间)。该文件会发生什么?会有数据损坏/丢失吗?如果是这样,那么阻止它/规避情况的最佳方法是什么(即设置一个进程等待另一个进程)。由于数据将根据数据中的信息添加到文档中的特定位置,因此我担心可能会有一些覆盖/丢失数据。
最终我要问的问题是,如果两个用户同时尝试编辑同一个文档,会发生什么以及如何防止它?
P.S。我不能自己测试,因为我没有得到最好的设置,但它可以肯定发生,无论我不能重现它。
编辑:除此之外,如果他们在读取数据时尝试添加数据,我怎么能阻止自动进程阻止用户输入?
编辑2:使用默认的Express设置将文件作为单个文本文档存储在./routes目录中。
预备编辑:(笑)。一切都在Windows 8 64bit上运行,如果这有所不同,我想它可以。
答案 0 :(得分:1)
处理冲突编辑有许多不同的策略。使用哪个取决于很多事情,包括你正在使用的基础设施(例如数据存储的类型),冲突的频率,是否需要保存编辑,是否可以使用锁定系统等。 ..无论如何,这里有一些可能的策略:
在更改前锁定。在编辑之前,要求用户“锁定”资源,当资源被锁定时,不要让任何其他用户尝试编辑它。如果客户端从未释放锁定(例如超时),则必须发明一些使锁定过期的方法。
更新期间锁定。检索/保存时的版本检查。拒绝冲突期间发生的编辑。当客户端获得他们希望编辑的版本时,它也会获得版本号。提交编辑时,它还会提交它认为编辑的版本号。如果存储库中的版本已经更改,则可能发生了冲突的编辑,并且可以拒绝编辑。
更新期间锁定。检索/保存时的版本检查。合并冲突期间发生的编辑。当客户端获得他们希望编辑的版本时,它也会获得版本号。提交编辑时,它还会提交它认为编辑的版本号。如果存储库中的版本已经更改,则可能发生了冲突的编辑,服务器可以尝试合并编辑,或者如果合并失败,则可以拒绝编辑。
更新期间锁定。检索/保存时进行版本检查。在冲突期间保存两个版本。当客户端获得他们希望编辑的版本时,它也会获得版本号。提交编辑时,它还会提交它认为编辑的版本号。如果存储库中的版本已更改,则可能发生了冲突编辑,并且可以保存两个编辑版本。 (如果两个客户试图将冲突的编辑保存到同一个笔记中,这就是EverNote所做的事情。)
对数据存储的读取和写入必须使其不会被希望更改数据的其他客户端中断(同时读取正常,但任何其他读取或写入中间的任何写入都不正常)。根据您使用的数据存储类型,还有许多可能的策略。
对于文件系统读/写,您可以使用文件打开权限为您提供对文件的独占访问权限,然后您可以实施适当的错误处理,以便在资源变为资源时可以重试对当前不可用的资源的请求可用。
这篇文章可能有用:node.js readfile woes