在共享文档编辑环境中实现锁定



我实现了一个显示文档元数据的网格,用户可以右键单击编辑文档。我想为此实现一个锁定机制。当一个用户打开编辑器时,锁定文档的最佳方式是什么?这些文档确实存在于数据库中。

只需添加一列,指定当前签出文件的人员。当一个人试图签出文件时,如果设置了该列,他们将无法签出该文件,并将收到签出人的通知。除非您每秒对一个文档有数千个请求,否则这种方法会很好地工作。

除了添加一列来说明谁签出了文件并阻止使用该列进行访问之外。您可以添加请求锁定的时间戳。

这样,如果有人请求,并且锁已经使用了30分钟,并且没有进行任何更改,他们就可以拿走锁。(如果原始用户没有优雅地退出或其他什么)。

如果文档在数据库中,则数据库本身应该支持防止不一致的访问。

http://docs.oracle.com/javase/6/docs/api/java/sql/Connection.html#setTransactionIsolation%28int%29

然而,如果编辑器在文件编辑期间没有保持数据库事务/连接的打开状态,并且java应用程序运行的是客户端而不是服务器端(因为你可以简单地在编辑器中创建一个锁来实现服务器端的并发),那么事情就会变得有点棘手,我还没有足够的数据库经验来说明如何解决这个问题,因为使用数据库中的字段来指示编辑状态在这种类型的设置中会出现并发问题(除非数据库本身支持锁定记录,但这取决于使用中的数据库引擎)。

哦,一种可能性是使用文件修改时间(在数据库中有一个时间戳字段,每次修改文件时都会更新它),并在检查时间戳并确定文件是否在用户尝试保存上次访问后被另一个用户修改的同时,保持一个不允许脏读的事务处于使用状态;如果是这样,它不会将文件保存到数据库中,而是会提醒用户服务器端文件已更改,并询问用户是否要查看更改(类似于版本控制系统的工作方式)。通过禁止对所有此类事务进行脏读取,可以防止其他用户在第一个事务打开时更改文件的记录(为了将记录标记为"脏",您可以使用一个伪字段,该字段将在每个事务开始时用一些随机值更新)。(注意:aglassman的答案与此类似。)

最新更新