我的情况是这样的。我有一个实体,由几个表中的几行组成。从概念上讲,这可以被视为单个文档。当用户打开“文档”时,必须锁定所有关联的行,就像Windows在打开文件时锁定文件一样。由于“文档”可能会在用户选择关闭之前打开,因此我认为交易不是可行的解决方案。我提出的唯一解决方案是在每个表中都有一个布尔“锁定”字段,并在打开“文档”时在相关行上将其设置为True。我正在使用SQL Server 2008 R2。
有什么想法吗?
答案 0 :(得分:1)
您可以使用application locking。
答案 1 :(得分:0)
假设每个文档都有唯一的ID,便携式解决方案是使用一个知道每个锁定文档的表:
CREATE TABLE DocumentLocked (
doc_id INT PRIMARY KEY,
session_id <some type>,
lock_acquired DATETIME
);
如果要锁定文档,请尝试插入相关文档的ID以及标识拥有会话的一些会话ID以及锁定它的时间。如果失败,则文档已被锁定。会话ID和lock_acquired列在锁定中不起作用。它只是帮助向用户显示有用的信息,例如“此文档在上午9:43被Rubio锁定。”
这种方法的一个问题是崩溃的客户端可能会永久锁定文档,因此您需要一些应用程序级别的机制来破解锁。 lock_acquired列可以作为超时机制,要求应用程序每隔一段时间更新一次,并使用它来检测失效锁。
如果您不关心可移植性,请使用@ demas的答案。
答案 2 :(得分:0)
在您的情况下,“锁定”可能是业务流程的一部分,不应将低级别的事务机制用于此目的。所以你是对的,你需要在所有参与的表中使用'锁定'字段,或者在特殊的“锁定”表中使用单个字段。