2009-02-20 21 views
0

我創建了兩個(或更多)線程在數據庫的表中插入數據。插入時,有一個字段CreatedDateTime,當然,它存儲記錄創建的日期時間。如何獲取兩個線程將特定的時間戳插入到表中?

對於一個情況下,我想線程來保持同步,讓自己CreatedDateTime領域將具有完全相同的值。當與多線程測試,平時我有不同的毫秒...

我想測試我的系統中不同的場景,如:

  • 1)衝突插入記錄正好在同一時間。
  • 2)訂購/選擇記錄的問題。
  • 3)數據庫連接池問題。
  • 4)多個用戶(百人)同時訪問的問題。

可能有其他測試情況下,我還沒有在這裏列出。

+0

這幾乎違背了線程調度程序的想法... – GEOCHET 2009-02-20 01:05:35

+0

我想你誤解了同步的詞。 – 2009-02-20 01:07:00

回答

5

是的,就是這樣。即使由於某種性質的怪異,你的線程也要在同一時間開始,他們很快就會因爲它們之間的資源爭用(最起碼,訪問數據庫表或DBMS服務器進程)而很快失去控制。

如果他們留大多是在步驟(即從來沒有超過幾毫秒更多),只是選擇不同的「分辨率」爲您CreatedDateTime領域。把它放在第二個(或第二個)而不是毫秒的最接近的10 。或以其他方式使用固定值。

否則,只要意識到這是完全正常的行爲。

而且,作爲在評論中指出的BC,你可能誤解這個詞的使用「同步」的。它被使用(在Java中,我希望C#是類似的),以確保兩個線程不會同時訪問同一資源。實際上,它幾乎可以保證線程不會保持同步,因爲你理解這個術語的含義(我個人認爲你的定義在英語使用方面是正確的(同時發生的事情),但某些計算機語言已經將定義他們自己的目的)。

如果您正在測試時會發生什麼具體的時間戳進入數據庫,你可以不依賴於線程「表現自己」的計劃正在按照特定的順序,並在特定的時間。你真的需要以某種方式虛擬出數據,否則就像試圖將果凍釘在樹上(或者訓練一隻貓)。

一個解決方案是不使用諸如getCurrentTime()now()之類的東西,而是使用具有已知時間戳的特定插入組。根據您的實際架構,這可能很困難(例如,如果您只是調用一個本身獲取當前時間戳爲毫秒分辨率的API)。

如果您控制填充時間戳列的實際SQL,則需要將其更改爲使用預先計算的值,而不是now()或其等效項。

0

如果你想有插入多行相同的時間戳;你應該創建一個SQL線程,它將在一個查詢中執行多行插入,這將允許你獲得相同的時間戳。除此之外,我同意其他人的看法,除非您在應用程序中看到插入時間戳,並且共享要插入的時間戳,否則無法以多線程獲取超大分辨率的確切時間戳。這當然會引發線索問題。這就像是說,我要分享這些數據,但我不想使用互斥鎖,因爲一旦它碰到鎖(),它們就停止處理另一個線程。

相關問題