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