2013-04-20 36 views
4

我有填充SQL Server 2008數據庫表這樣的ASP.NET Web應用程序:不知道有關SQL Server鎖的類型用於同步

INSERT INTO tblName1 (col1, col2, col3) 
VALUES(1, 2, 3) 

我也有一個單獨的服務應用程序首先重命名該表處理該表的內容(在後臺),然後通過創建一個空表是這樣:

SET XACT_ABORT ON 
BEGIN TRANSACTION 

--Rename table 
EXEC sp_rename 'tblName1', 'temp_tblName1' 

--Create new table 
CREATE TABLE tblName1(
id INT NOT NULL IDENTITY(1,1) PRIMARY KEY, 
col1 INT, 
col2 INT, 
col3 INT 
) 
COMMIT 

SET XACT_ABORT OFF 
--Begin working with the 'temp_tblName1' table 

我什麼不知道是哪個SQL鎖,我需要在此使用tblName1桌子上的情況?

PS。爲了給你提供這兩個代碼示例運行的頻率:首先可以每秒運行幾次(儘管大多數時間,不太頻繁),第二次運行 - 一天兩次。

+0

我不知道你的意思是「鎖定」,但這聽起來像[Transact-SQL](http://en.wikipedia.org/wiki/Transact-SQL)。 – 2013-04-20 23:49:20

+0

是的,它是t-SQL。我更新了標籤。 「鎖定」是指同時訪問「tblName1」表的同步鎖定。 – c00000fd 2013-04-21 00:20:24

+0

在'rename'和'CREATE'之間'INSERT'到達命中服務器*的次數可能很小 - 其他錯誤(例如機器之間的網絡連接丟失)更多很可能 - 因此只需編寫一些強大的錯誤處理並忽略這種特殊情況(或者,如果您正在構建下一個世界主導網站,請使用企業版和分區表,並且根本不要執行重命名/創建) – 2013-04-21 02:48:15

回答

0

正如一些評論所建議的,考慮以不同的方式做。您可能會從使用snapshot isolation level獲益。使用快照隔離要求在數據庫上將ALLOW_SNAPSHOT_ISOLATION設置爲ON。此設置默認處於關閉狀態,因此您需要檢查是否可以打開它。

一旦你能夠使用快照隔離,你不需要改變你的INSERT語句,但你的其他進程可能會更改爲類似:

SET XACT_ABORT ON 
SET TRANSACTION ISOLATION LEVEL SNAPSHOT 
BEGIN TRANSACTION 

-- Do whatever this process does, but don't rename the table. 

-- If you want to get rid of the old records: 
DELETE [tblName1] WHERE 1 = 1 
-- Then 
COMMIT TRANSACTION 

如果你真的需要創建一個新的非臨時表,出於某種原因,在進入事務之前可能需要這樣做,因爲在快照隔離期間您可以執行的操作有一些限制。