1

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

4

3 回答 3

4

只需添加一列,指定当前已签出文件的人员。当一个人尝试签出文件时,如果设置了该列,他们将无法签出该文件,并且会通知谁签出了该文件。除非您每秒对单个文档有数千个请求,否则此方法可以正常工作。

于 2013-06-25T16:23:00.237 回答
1

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

这样,如果有人请求它并且锁是,例如,30 分钟前没有进行任何更改,他们可以获取锁。(如果原始用户没有优雅地退出或其他什么)。

于 2019-01-16T13:49:10.527 回答
0

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

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

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

哦,一种可能性是使用文件修改时间(在数据库中有一个时间戳字段并在每次修改文件时更新它)并在检查时间戳并确定是否在用户尝试保存上次访问文件后,文件被另一个用户修改;如果是这样,它不会将文件保存到数据库中,而是会提醒用户服务器端文件已更改并询问他们是否要查看更改(类似于版本控制系统的工作方式)。通过禁止所有此类事务的脏读,这应该可以防止其他用户在第一个事务打开时更改文件的记录(要将记录标记为“脏”,您也许可以使用将在开始时更新的虚拟字段每笔交易都有一些随机值)。

于 2013-06-25T16:10:39.427 回答