2010-07-02 62 views
2

我想要做的是,告知用戶有關我的程序「數據庫中有更新正在進行,所以結果可能不正確「。因此,我必須檢查我的程序使用的桌面上是否存在某些過程(如寫入或刪除)。SQL Server「正在檢查數據庫表如果有進程正在進行」

編輯:我更新我的表的方式是我使用MS Access,我從MS Excell約10,000行復制並使用MS Access將其粘貼到數據庫。所以當複製粘貼正在進行時,我希望能夠從我的基於Web的程序中看到它。

謝謝。

+0

難道你不能這樣做,使得更新永遠不會與讀取同時發生,例如事務? – 2010-07-02 12:43:30

回答

-1

在某處(在此過程中,或者在服務器上,文件或共享內存等中)創建共享計數器。不要這樣

increment the counter 
query(UPDATE blablabla) 
decrement the counter 

你更新你就顯露了消息,如果計數器大於0

(但是,這是你真正想要的是什麼?見註釋)

+1

永遠不要實現你自己的鎖定 – gbn 2010-07-02 13:25:00

+0

@gbn爲什麼不呢?有時您需要做的不僅僅是更新數據庫(寫入常規文件或其他),在這種情況下,使用數據庫提供的功能是沒有意義的。 – 2010-07-02 14:38:09

+1

你的鎖定表上的併發問題會有同樣的問題......如果你不想等,你可以設置@@ locktimeout爲例。同樣在這種情況下,客戶端命令超時會發生什麼?你的計數器保持> 0 =擰緊... – gbn 2010-07-02 14:48:17

3

我不能肯定我明白你在這裏想要達到的目標。

只要您使用合適的隔離級別,SQL Server就會爲您管理數據的完整性和一致性。

所以,如果您的計數/報告查詢試圖訪問當前正在更新的記錄,它不會是能夠獲得一個共享鎖(在記錄目前正在更新),直到更新操作完成後,從而確保僅報告已提交的數據。因此,報告在完成時是正確的。

進一步的閱讀可見:Transaction Isolation Levels

+0

我編輯了關於如何編輯我的數據庫的問題。 – stckvrflw 2010-07-05 06:19:08

0

更新,回覆:

「編輯:我更新我的路表是我使用的MS Access,我從MS的Excell複製約10.000行並使用MS Access將其粘貼到數據庫中,所以當複製粘貼進行時,我希望能夠從我的基於Web的程序中看到它。「

原理相同,在粘貼過程開始時,添加一個DB行,就像在我的第一個答案中一樣。或者,您可以在您的Web應用程序中設置一個全局變量,如updateInProgress = true

但是,這個副本需要多長時間?如果它少於5分鐘,那麼它可能不值得做其他事情。

如果你只是想讓用戶知道有「新鮮」的數據,你可以查詢最近的日期時間。


什麼樣的更新? 通常情況下,SQL Server通過默認事務鎖定保持結果準確。

也許你的意思是一個長時間的數據導入工作?或者,天堂禁止,一些密集的,光標驅動的過程?

然後,你可以這樣做:

  1. 在數據庫中創建一個表。稱之爲LongJobLog。它可能有3列:一個ID,一個開始日期時間和一個結束日期時間。

  2. 在每個長作業開始時,向該表添加一個新的開始時間,確保將新ID保存到一個變量中。

  3. 作業結束或出錯時,使用endtime更新ID的行。

  4. 您的應用程序將查詢此表以查找仍有空結束時間的最近行(按開始時間)。如果存在這樣的行,則「更新」正在進行中。

  5. 您可能需要cron作業來清除作業崩潰的條目。

或者,此啓動停止信息可能在SQL日誌中可用。不過,可能需要一些工作來整理。

+0

我編輯了關於如何編輯我的數據庫的問題。 – stckvrflw 2010-07-05 06:19:32

相關問題