2012-09-30 75 views
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標識更新信號量表。
  5. 進程A和B都執行事務(不是我想要的)。

請沒有答案,其中包括使用IF SQL語句的,因爲我的JET-SQL的版本不能使用。

+1

你打算如何處理「proc A獲得鎖,proc A開始在受保護的表中工作,proc A崩潰」? –

+0

@Damien_The_Unbeliever:如果proc崩潰,那麼它的事務將不會被提交,並且它的鎖將被釋放,對嗎? – CJ7

+0

我不確定 - 如果您無法從系統獲得許多原子性保證,您似乎正在使用相當破碎的技術,正如您似乎指出的那樣。 –

回答

0

我不確定這是否會解決您的問題全部。但是創建一個不是自動生成的主鍵的表。如果可能的話,還用某種檢查/規則聲明同一列,強制該列只能包含一個可能的值。

您現在有一個表可以包含0或1行。要獲得「信號量」,請在表中插入一行,並使用單個固定的PK值。如果插入成功,則您擁有信號量。如果插入由於主鍵違例而失敗,那麼您沒有獲得信號量。關鍵是不是先執行初步檢查 - 只是嘗試插入。

如果您的技術如此破碎以致無法保證PK約束條件得以維持,那麼您需要認真考慮改變技術。

如果你失敗插入行,那麼你可以開始定期輪詢這張表 - 在任何間隔看來都適合。


另一種方法是有表有一個自動編號PK列 - 當你想獲得的信號,插入一行到表中。然後,查詢表以找到具有最低PK列值的行。如果該行是你的行,那麼你現在擁有信號量。您仍然必須進行民意調查,但您實際上在此表中記錄了「預訂」。

和前面的例子一樣,一旦你完成了你的信號量保護工作,你從表中刪除你的行。第二種方法應該是「更公平」(因爲每個進程都可以按照請求的嚴格順序訪問),但實際上可能看起來更加混亂。它確實依賴所有進程保持「活」。

+0

PK約束解決方案看起來像是最好的選擇。怎麼樣的崩潰情況? – CJ7