0

我想在事务执行时锁定 MDB 表以防止读取。我会使用dbDenyRead,但显然这是不可靠的,并不总是锁定表:

http://www.office-archive.com/32-ms-access/c2bd1a2553e79c60.htm

如何使用信号量解决方案来实现对表的虚拟锁定?

如果我将信号量存储在另一个表中,其中一行包含表名和将在事务结束时清除的进程/工作站 ID,我该如何防止以下序列?

  1. 进程 A 查询信号量表,发现它是空白的。
  2. 进程 B 查询信号量表,发现它是空白的。
  3. 进程 A 使用进程 A ID 更新信号量表。
  4. 进程 B 使用进程 B ID 更新信号量表。
  5. 进程 A 和 B 都执行事务(不是我想要的)。

请不要包含使用IFSQL 语句的答案,因为我的 JET-SQL 版本不能使用它。

4

1 回答 1

0

我不确定这是否会解决您的所有问题。但是使用非自动生成的主键创建一个表。如果可能,还使用某种检查/规则声明同一列,强制该列只能包含一个可能的值。

您现在有一个可以包含 0 或 1 行的表。要获得“信号量”,请在表中插入一行,具有单个固定的 PK 值。如果此插入成功,则您拥有信号量。如果插入由于主键冲突而失败,那么您没有获得信号量。关键是不要先执行初步检查 - 只需尝试插入。

如果您的技术如此糟糕以至于无法保证保持 PK 约束,那么您非常需要考虑更改技术。

如果您未能插入该行,那么您可以开始定期轮询该表 - 在任何看起来合适的时间间隔。


另一种选择是让表有一个自动编号 PK 列 - 当您想要获取信号量时,在表中插入一行。然后,查询该表以找到具有最低 PK 列值的行。如果该行是您的行,那么您现在拥有信号量。您仍然需要投票,但您实际上在此表中记录了“保留”。

与前一种情况一样,一旦您完成了受信号量保护的工作,您就可以从表中删除您的行。第二种方法应该“更公平”(因为每个进程都按照严格的请求顺序获得访问权限),但在实践中可能看起来更混乱。它确实依赖于所有进程保持“活动”。

于 2012-09-30T15:28:22.143 回答