代码之家  ›  专栏  ›  技术社区  ›  Yi Jiang G-Man

监视用户会话以防止编辑冲突

  •  5
  • Yi Jiang G-Man  · 技术社区  · 14 年前

    我正在做一个类似于粘贴箱的东西(是的,它是 通用),但允许多用户编辑。明显的问题是多个用户试图编辑同一个文件。我的思路是在一个用户处理文件时锁定该文件(这不是最好的解决方案,但我不需要太复杂的东西),但是为了防止/警告用户,我显然需要一个系统来监视每个用户的编辑会话。在使用数据库和ajax时,我想到了两种解决方案。

    当然,要应付 问题是,我们必须让服务器对以前关闭的会话发出的新请求做出错误响应,告诉客户端向用户指出其会话已结束,然后通过将其保存为服务器上的另一个文件并要求用户手动合并来处理,不用说,这对最终用户来说是相当可怕的。

    所以我想到了另一个解决办法。也有可能得到一个 unload 事件在用户会话结束时触发,但我不能确定这是否能可靠地工作。

    4 回复  |  直到 14 年前
        1
  •  6
  •   Mr. Shiny and New 安宇    14 年前

        2
  •  2
  •   David_001    14 年前

    基本方法是: 1用户A获取要编辑的文档,文档处于版本1 三。用户B发布了一些更改,包括基本版本号1 4服务器更新文档,文档现在为版本2 5用户B发布了一些更改,包括基本版本号1 6服务器回复说,自从用户开始编辑文档以来,文档已经更改,并向用户发送新文档,然后他们的版本-用户将需要执行任何将他们的更改合并到文档版本2中的操作,并发回服务器。用户现在基本上正在编辑文档版本2 7用户A发布了一些更改,包括2的版本号

    你仍然可以每分钟“ping”一次,以获得当前的版本号-你已经知道他们正在编辑的版本,因此如果有新版本可用,你可以让他们知道,并让他们下载最新版本以进行更改。

    这种方法的主要优点是用户从不锁定文件,因此不需要任何任意的“超时”。

        3
  •  0
  •   InvisibleBacon    14 年前

    有一个名为“active\u edits”或类似的表,其中有一列表示文档id、用户和上次更新时间。假设ping时间为1分钟,超时时间为5分钟。所以用例应该是这样的:

    鲍勃打开一个文件。它检查上次更新的时间。如果超过5分钟,用Bob和当前时间更新表。如果不是,则说明其他人正在处理文档,因此请给出错误消息。假设文档没有被编辑,Bob会处理文档一段时间,客户端每分钟ping一次更新时间。

    我会说 包括一个“完成编辑”按钮和一个onunload处理程序。据我所知,是奥恩洛德 是片状的,但不妨加上它。这两种方法都会向服务器发送一个只发送邮件的帖子,说Bob已经完成了。即使Bob没有点击finishediting,onunload也会消失,最坏的情况是另一个用户需要再等5分钟才能编辑。好处是,如果这些正常工作(一个公平的假设),那么系统工作得更好一些。

    如果您描述了一个Bob的无线连接不好或需要休息的地方:我会说这不是什么大问题。ping函数应该确保自从Bob上次ping之后文档没有被其他人接管。如果有,只需给Bob一条消息,说“其他人已经开始处理文档”,并给他们重新加载的选项。

    编辑:还有,我会调查 window.onbeforeunload ,而不是onunload。我相信它执行得更早。我相信这是功能网站(包括slashdot)使用,让你确认你真的想离开网页。我认为除了Opera,其他主流浏览器都可以使用。

        4
  •  0
  •   Community THelper    7 年前

    How do you manage concurrent access to forms? ,我不会尝试实现悲观锁定。在无状态环境中可靠地工作实在太难了。相反,我会使用乐观锁定。但是,在本例中,我使用了类似于文件的SHA哈希的内容来确定自用户上次读取该文件以来该文件是否发生了更改。对于每个更改文件的请求,您将运行文件字节的SHA哈希,并将其与第一次读取数据时提取的版本进行比较。如果已更改,则拒绝更改并强制用户再次进行编辑(提取文件内容的新副本),或者提供更高级的冲突解决方案。