我想要做的是,告知用戶有關我的程序「數據庫中有更新正在進行,所以結果可能不正確「。因此,我必須檢查我的程序使用的桌面上是否存在某些過程(如寫入或刪除)。SQL Server「正在檢查數據庫表如果有進程正在進行」
編輯:我更新我的表的方式是我使用MS Access,我從MS Excell約10,000行復制並使用MS Access將其粘貼到數據庫。所以當複製粘貼正在進行時,我希望能夠從我的基於Web的程序中看到它。
謝謝。
我想要做的是,告知用戶有關我的程序「數據庫中有更新正在進行,所以結果可能不正確「。因此,我必須檢查我的程序使用的桌面上是否存在某些過程(如寫入或刪除)。SQL Server「正在檢查數據庫表如果有進程正在進行」
編輯:我更新我的表的方式是我使用MS Access,我從MS Excell約10,000行復制並使用MS Access將其粘貼到數據庫。所以當複製粘貼正在進行時,我希望能夠從我的基於Web的程序中看到它。
謝謝。
在某處(在此過程中,或者在服務器上,文件或共享內存等中)創建共享計數器。不要這樣
increment the counter
query(UPDATE blablabla)
decrement the counter
你更新你就顯露了消息,如果計數器大於0
(但是,這是你真正想要的是什麼?見註釋)
我不能肯定我明白你在這裏想要達到的目標。
只要您使用合適的隔離級別,SQL Server就會爲您管理數據的完整性和一致性。
所以,如果您的計數/報告查詢試圖訪問當前正在更新的記錄,它不會是能夠獲得一個共享鎖(在記錄目前正在更新),直到更新操作完成後,從而確保僅報告已提交的數據。因此,報告在完成時是正確的。
進一步的閱讀可見:Transaction Isolation Levels
我編輯了關於如何編輯我的數據庫的問題。 – stckvrflw 2010-07-05 06:19:08
更新,回覆:
「編輯:我更新我的路表是我使用的MS Access,我從MS的Excell複製約10.000行並使用MS Access將其粘貼到數據庫中,所以當複製粘貼進行時,我希望能夠從我的基於Web的程序中看到它。「
原理相同,在粘貼過程開始時,添加一個DB行,就像在我的第一個答案中一樣。或者,您可以在您的Web應用程序中設置一個全局變量,如updateInProgress = true
。
但是,這個副本需要多長時間?如果它少於5分鐘,那麼它可能不值得做其他事情。
如果你只是想讓用戶知道有「新鮮」的數據,你可以查詢最近的日期時間。
什麼樣的更新?
通常情況下,SQL Server通過默認事務鎖定保持結果準確。
也許你的意思是一個長時間的數據導入工作?或者,天堂禁止,一些密集的,光標驅動的過程?
然後,你可以這樣做:
在數據庫中創建一個表。稱之爲LongJobLog。它可能有3列:一個ID,一個開始日期時間和一個結束日期時間。
在每個長作業開始時,向該表添加一個新的開始時間,確保將新ID保存到一個變量中。
作業結束或出錯時,使用endtime更新ID的行。
您的應用程序將查詢此表以查找仍有空結束時間的最近行(按開始時間)。如果存在這樣的行,則「更新」正在進行中。
您可能需要cron作業來清除作業崩潰的條目。
或者,此啓動停止信息可能在SQL日誌中可用。不過,可能需要一些工作來整理。
我編輯了關於如何編輯我的數據庫的問題。 – stckvrflw 2010-07-05 06:19:32
難道你不能這樣做,使得更新永遠不會與讀取同時發生,例如事務? – 2010-07-02 12:43:30