文档并发控制
# 文档并发控制
# 问题背景
B/S架构下用户访问都是并发的,也就是说经常会出现同时N个用户对一个服务器页面发出请求,这就有可能同一个文档被多个用户同时打开进行编辑,保存时文件就可能出现互相覆盖的问题。为什么会出现互相覆盖呢?举个简单例子,例如A用户先访问页面打开了一个文档开始编辑,这时B用户访问相同的页面打开了同一个文档也开始编辑,B用户可能很快就完成了文档修改工作并且保存到服务器。随后A用户也完成了工作并保存文档到服务器。这时,服务器上的这个文档已经变成了A用户修改的版本,B用户的修改被A的保存操作覆盖从而消失了。
# PageOffice的并发控制
PageOffice V5及以前的版本提供了的并发控制,能够保证同一时间同一篇文档只能由一个人打开,而且只需在调用PageOffice的WebOpen方法打开文件之前,设置TimeSlice属性的时间长度即可实现。只要启用了PageOffice提供的并发控制功能,就能实现只有当前用户可以对此文档进行编辑、保存等操作,其他用户只能以只读的形式打开。但是此功能仅限于单体Web项目且部署在一台服务器上,由于现在越来越多的项目使用了微服务架构或集群部署,此功能就显得越来越可有可无,因此PageOffice V6版本就不在提供TimeSlice属性实现的并发控制功能。
# 解决方案
- 在Web项目中引入工作流模块,让服务器上文件随着工作流的流转控制文件的可见性。通过工作流,文件会随着一系列预设的步骤流转,每个步骤都与特定的角色或用户相关联。当一个文件进入工作流,它首先会流转到指定的用户或角色。在这个阶段,文件的可见性是受限的,每个用户只能看到和操作自己权限范围内的文档,对于有编辑权限的用户,可以调用PageOffice的编辑模式打开文件。这种设计有效地避免了同一个文档被多个用户同时打开进行编辑的并发问题。
- 利用锁机制原理自主实现并发控制,这是最常用的并发控制方法。当一个用户开始编辑一个文件时,可对该文件加锁,这样其他用户就不能对其进行编辑。当用户完成编辑并释放锁时,其他用户才能编辑该文件。简单来说,比如数据库中的Document表记录了所有文档的信息,那么可以给Document表添加一个Opened字段,默认值是false,当A用户打开某个文件时,就设置此文件记录Opened字段为true,其他用户再想打开文件时,就可以通知用户此文件正在被A用户编辑;当A用户关闭文件时,通过ajax请求设置再此文件记录Opened字段为false。这样就实现了最简单的文件并发控制,PageOffice V5及以前的版本提供的并发控制也是这个原理,只不过没有使用数据库表来记录文件的打开状态。
上次更新: 2024/01/05, 16:21:19