2010-03-05 44 views
1

我有一個數據上傳功能,可以將一些數據加載到多個表中並進行處理。我希望我的用戶能夠一次啓動兩次上傳(儘管這將是例外情況而非規則),但在那種情況下,我希望在第二次上傳開始之前完成第一次上傳。 (整個過程大約需要20秒)。如何確保SQL Server中的一次性處理?

原因是,如果兩次上載將數據同時存入表中,則會干擾彼此的數據。 (注意:我原本打算用臨時表來實現進程隔離,但是發現我是couldn't do that)。

確保上傳2在上傳1完成之前等待的最佳方式是什麼?我可以創建一個表作爲互斥鎖,並在封裝整個過程的事務中對該表(或已知行)鎖定一個鎖,但有沒有更清晰或更高效的方法來執行此操作?

+2

FFS。我原本將這個問題題爲「什麼是......的最佳方式」,而不是「我怎麼能......」,並得到了這樣一個信息,即這個問題很可能被封閉爲「主觀的」。我們應該如何獲得有關做某事的最佳方式的建議?這不是網站的用途嗎? –

+0

「最好的辦法是......」是主觀的,一種方式比其他方式更好。 「我怎麼能......」並不認爲任何解決方案都比另一個更好。你只需要相信「最好的方式」會比其他任何人獲得更多的選票。 –

回答

1

製作一個可序列化的存儲過程,它發出一個唯一標識符並用該ID標記上傳。然後他們可以進入同一張桌子。然後,上傳者可以啓動一個用該ID標記的批處理過程,以將數據合併到目標中。

+0

我不太清楚「serialisable」sproc是什麼意思?但是,您描述的具有ID列的技術,以便每次上載都可以使用不同的ID,這正是我開始使用的位置。然後我意識到,因爲我正在使用BULK INSERT加載數據,所以我無法在創建新增記錄時真正設置ID,因此我無法確定它們是以正確的ID。除非你知道有辦法做到這一點? –

+0

Serialisable - 在生成和發佈上傳批次ID的事務期間,sproc將事務隔離級別設置爲serialisable。它開始交易,獲取ID(可能插入帶有標識列並閱讀@@標識的表),提交事務並返回。這給你一個很好的,原子的,單調遞增的批次ID,你可以在以後記錄狀態信息。 – ConcernedOfTunbridgeWells

+0

對不起,也許我很密集,但想出一個批次ID不是問題(也不是解決我的實際問題)。除非我能夠以這樣的方式執行我的BULK INSERT,所有新記錄在創建後都會使用批次ID進行標記,所以我不會再向前邁進。我不得不將所有內容都包裹在一個事務中,而不僅僅是創建ID?這幾乎是其他人所暗示的。 –

1

我會建議把每個上傳都放在它自己的交易中。這樣他們就不會感到厭煩。

1

交易應該提供隔離。你能解釋他們爲什麼不適合你的場景嗎?

+0

如果我在事務中包裝整個事物,那麼*我所做的所有事情都將被事務化,因此我在上傳過程中觸摸的每個表都會在某種程度上被阻塞。我只關心阻止訪問上傳過程中使用的特定表,我寧願所有其他表都不受影響。所以是的,這將提供隔離 - 但我希望可能有另一種方式,將有較少的開銷。 –

1

在所有的上傳例程中,在每個受影響的表上請求獨佔的TABLOCK。這樣第二次上傳就會等到現有的TABLOCK發佈。

+0

你能舉一個我應該怎麼做的簡短例子嗎? –

+0

@Gary McGill,'DECLARE @Count int; BEGIN TRANSACTION; SELECT @ Count = COUNT(*)FROM YourTable WITH(tablock);/*你的處理在YourTable */COMMIT;' –

相關問題