我想在事务执行时从读取中锁定MDB表。我会使用dbDenyRead
,但显然这是不可靠的,并不总是锁定表:
http://www.office-archive.com/32-ms-access/c2bd1a2553e79c60.htm
如何使用信号量解决方案在表上实现虚拟锁?
如果我将信号量存储在另一个表中,其中一行包含表名和一个将在事务结束时清除的进程/工作站ID,我该如何阻止以下序列?
- 进程A查询信号量表并将其查找为空白。
- 进程B查询信号量表并将其查找为空白。
- 进程A使用进程A ID更新信号量表。
- 进程B使用进程B ID更新信号量表。
- 进程A和B都执行事务(不是我想要的)。
醇>
请不要包括使用IF
SQL语句的答案,因为我的JET-SQL版本无法使用它。
答案 0 :(得分:0)
我不确定这是否会解决所有问题。但是创建一个包含未自动生成的主键的表。如果可能,还要使用某种检查/规则声明相同的列,该检查/规则强制该列可能只包含一个可能的值。
您现在有一个可以包含0或1行的表。要获得“信号量”,请在表中插入一行,并使用单个固定的PK值。如果此插入成功,则您拥有信号量。如果插入因主键冲突而失败,则表示您未获得信号量。关键是不首先执行初步检查 - 只需尝试插入。
如果你的技术破碎,无法保证PK约束能够得到维护,那么你就需要考虑改变技术。
如果你失败插入行,那么你可以开始定期轮询这个表 - 无论什么时间间隔合适。
另一种方法是让表具有自动编号PK列 - 当您想获取信号量时,在表中插入一行。然后,查询表以找到具有最低PK列值的行。如果该行是您的行,那么您现在拥有信号量。您仍然需要轮询,但您实际上已在此表中记录了“预订”。
与前一种情况一样,完成信号量保护工作后,您将从表中删除行。第二种方法应该是“更公平”(因为每个进程都按照严格的请求顺序获得访问权限),但在实践中可能看起来更加混乱。它确实依赖所有进程保持“实时”。