2012-04-12 48 views
3

我在我的存儲過程中使用begin transaction。我有更新數據的代碼:BEGIN TRANSACTION是否執行任何行/列鎖定?

UPDATE 
    employee 
SET 
    name = @name, 
    surname = @surname 
WHERE 
    empId = @empid; 

SQL Server是否對要更新的行或列進行任何鎖定?如果情況並非如此,那麼當有更新正在進行時,我將如何防止其他用戶再次進行更新?它不必在存儲過程中,C#也是一個選項。

+2

否 - BEGIN TRANSACTION本身並不做任何事情。 'UPDATE'語句將嘗試在被更新的行(或行)上獲取**更新鎖**(U),並保持這些鎖,直到事務完成(使用「COMMIT」或「ROLLBACK」) 。 – 2012-04-12 09:05:06

+0

@marc_s:這不是100%準確。 **(1)**通常,在讀取行時取得'U'鎖。然後,當'SQL Server'決定更新它時,通過將'U'鎖轉換爲'X'鎖在行上需要一個'X'鎖。 **(2)**但是,在某些情況下,'SQL Server'決定直接使用'X'鎖定(所以,沒有'U'鎖定,然後'U - > X'轉換)。 – 2012-04-12 09:58:11

+0

@BogdanSahlean:好的 - 也許 - 但是'BEGIN TRANSACTION'本身並沒有做任何事情 - 這是OP的要求。對?? – 2012-04-12 10:01:59

回答

3

SQL Server確實針對正在訪問的對象發出鎖定 - 並且根據所發生的情況,鎖定變得非常複雜。

對於您的特定更新聲明,假設正在更新單個行。

  • Row:Update Lock獲取訪問權限更新數據,然後在數據被修改時轉換爲Exclusive Lock。

  • 頁面:意圖更新,在數據修改時轉換爲Intent Exclusive。

  • 表:意圖更新。

有很多關於在MS網站鎖定模式的細節:http://msdn.microsoft.com/en-us/library/ms175519(v=sql.100).aspx

0

如果這是sproc中的唯一聲明,那麼它是一個事務。請記住,每條語句都是原子語言,無論是否工作,您都不需要擔心鎖定問題。

相關問題