2013-04-15 176 views
2

建議的副本不回答標題中的問題。正確執行2條SQL命令而不執行其他命令的方法

我想執行兩個MSSQL命令,但沒有任何其他「用戶」(我不知道什麼是正確的術語)在它們之間執行命令。

搜索,我發現兩種方法看起來他們會做到這一點,但我不確定他們:

  1. 使用TABLOCK。 - 但我看到它被認爲是不好的做法。

  2. 使用交易 - 但我所能找到的是它將是原子的,並且不一定會鎖定其他操作。

什麼方法是正確的方法?

更多信息:只有我的程序要訪問數據庫,但也可能是從它的幾個實例,我不介意短暫的等待 - 如果一個實例將不得不排隊等待一兩秒鐘- 沒關係。

編輯:我試圖插入一行,並得到它的身份。 (看起來並不像我期望的那樣直截了當。)

+1

你能解釋爲什麼它如此重要以至於不會執行其他查詢? – Pako

+0

這兩個命令是什麼? – mbeckish

+0

事務不會鎖定正在使用的表以防止更改已使用的數據嗎? – MAV

回答

3

您需要使用交易的IsolationLevel。這將阻止其他用戶在事務持續時間內讀取或修改查詢所使用的行,而不會完全鎖定表。

+0

謝謝。我想要鎖定整個桌子。那可能嗎? – ispiro

+0

@ispiro你爲什麼要鎖定整個表格? –

+0

因此,沒有人會先看到這些數據,然後再寫入新數據。 – ispiro

11

要插入一行並獲取其身份,您不需要阻止所有其他命令。就在組合使用事務與SCOPE_IDENTITY

BEGIN TRAN; 

INSERT INTO MyTable (MyColumn) 
VALUES ('MyValue'); 

SELECT SCOPE_IDENTITY(); 

COMMIT TRAN; 

更多SCOPE_IDENTITYMSDN

+0

我錯過了爲插入值獲取ID的位,這是爲特定情況提供的方式。 –

+0

謝謝。作爲閱讀您的答案的結果,我搜索了並發現MSSQL中可能存在一個錯誤,導致該錯誤不可靠。 (請參閱:http://support.microsoft.com/kb/2019779)。或者,這是一個古老的,但已被修復? – ispiro

+0

根據該鏈接,「此問題的修補程序是在累積更新5中爲SQL Server 2008 R2 Service Pack 1首次發佈的。」 –

1

您不能阻止命令在兩個其他命令之間執行。你所能做的就是防止數據被修改,直到你完成自己的修改。這是通過使用各自隔離級別的事務完成的。