我实现了一个显示文档元数据的网格,用户可以在右键单击时编辑文档。我想为此实现一个锁定机制。当一个用户打开编辑器时,锁定文档的最佳方法是什么?这些文档确实驻留在数据库中。
答案 0 :(得分:4)
只需添加一列,指定当前签出文件的人员。当一个人试图签出一个文件时,如果该列被设置,他们将无法检查它,并将被通知谁签出了它。除非单个文档每秒有数千个请求,否则此方法可以正常工作。
答案 1 :(得分:1)
除了添加一列来说明谁签出了文件并阻止使用该文件外,还添加了一列。您可以为请求锁定的时间添加时间戳。
通过这种方式,如果有人提出要求,并且该锁的使用时间为30分钟(例如未进行任何更改),则他们可以获取该锁。 (如果原始用户没有正常退出或其他原因)。
答案 2 :(得分:0)
如果文档在数据库中,则数据库本身应支持防止访问不一致。
http://docs.oracle.com/javase/6/docs/api/java/sql/Connection.html#setTransactionIsolation%28int%29
但是,如果编辑器在文件编辑期间没有保持数据库事务/连接处于打开状态,并且java应用程序运行客户端而不是服务器端(因为您可以在编辑器中创建锁以实现并发)事情变得有点棘手,我还没有足够的数据库经验来说明如何解决这个问题,因为在数据库中使用一个字段来指示编辑状态会对这种类型的设置产生并发问题(除非数据库本身支持锁定记录,但这取决于使用的数据库引擎。
哦,一种可能性是使用文件修改时间(在数据库中有一个时间戳字段并在每次修改文件时更新它)并在检查时间戳时保持允许使用无脏读取的事务在用户尝试保存上次访问后,确定该文件是否被其他用户修改;如果是这样,它将不会将文件保存到数据库,而是提醒用户服务器端文件已更改,并询问是否要查看更改(类似于版本控制系统的工作方式)。通过禁止所有此类事务的脏读,这应该阻止其他用户在第一个事务打开时更改文件的记录(将记录标记为“脏”),您可以使用一个虚拟字段,该字段将在开始时更新每个交易都有一些随机值)。 (注意:aglassman的回答与此类似。)