我需要以線程安全的方式執行一些Sql服務器存儲過程。目前我正在使用軟件鎖(C#鎖)來實現這一點,但不知道Sql服務器本身提供了哪些功能來實現線程安全。它似乎有一些內置到Sql服務器的表和行鎖定功能。多線程環境中的SQL Server存儲過程
同樣從性能角度來看,什麼是最佳方法?軟件鎖?或者Sql Server內置鎖?
感謝, Shamika
我需要以線程安全的方式執行一些Sql服務器存儲過程。目前我正在使用軟件鎖(C#鎖)來實現這一點,但不知道Sql服務器本身提供了哪些功能來實現線程安全。它似乎有一些內置到Sql服務器的表和行鎖定功能。多線程環境中的SQL Server存儲過程
同樣從性能角度來看,什麼是最佳方法?軟件鎖?或者Sql Server內置鎖?
感謝, Shamika
在客戶端的線程將有很少做與數據庫的行爲。 SQL Server是一個多用戶數據庫,所以任何人都可以同時在不同的機器上對數據庫做任何事情,而世界上所有的線程安全性都不會對此有所幫助。 SQL Server將在事務處理期間使用鎖來維護數據庫,以確保ACID規則和所有數據庫約束得以維護。
通常,當您在同一個線程上的單臺機器上執行存儲過程時,它們將是順序的並且不會發生衝突。如果您有多個線程或使用ADO.NET的異步功能,那麼這些過程可能會在SQL Server中相互干擾 - 即阻塞或死鎖 - 但SQL Server將處理所有這些問題。顯然,在這種情況下,你應用程序中圍繞它們的任何代碼都需要是線程安全的 - 也就是說,你不能對這兩個請求使用相同的IAsyncResult句柄,你需要確保兩個線程都不會嘗試修改相同的數據爲完成的結果等。
您需要更清楚地佈置您的需求,因爲這是兩種完全不同的鎖定方案。
在我的應用程序中最簡單的存儲過程中,在向表中添加新記錄之前,我首先檢查存在。我需要以線程安全的方式執行此操作。 – Shamika 2010-03-19 04:45:11
@Shamika--這不會是一個線程安全問題,除非另一個線程插入同一行(爲什麼你的應用程序會這樣做?)。 – 2010-03-19 15:11:48
我插入到數據庫的數據我從外部數據庫獲得,但我沒有任何控制權。即使我應該從外部數據庫中獲得唯一的關鍵字段,我發現有時情況並非如此。所以在將這些記錄插入我的數據庫之前,我需要做這個獨特的密鑰驗證。數據插入是多線程的。 – Shamika 2010-03-22 05:15:21
你的存儲過程是做什麼的?如果它們是面向事務的,那麼同時執行多少個線程並不重要。 – Gabe 2010-03-19 03:11:20