我在我的存儲過程中使用begin transaction。我有更新數據的代碼:BEGIN TRANSACTION是否執行任何行/列鎖定?
UPDATE
employee
SET
name = @name,
surname = @surname
WHERE
empId = @empid;
SQL Server是否對要更新的行或列進行任何鎖定?如果情況並非如此,那麼當有更新正在進行時,我將如何防止其他用戶再次進行更新?它不必在存儲過程中,C#也是一個選項。
否 - BEGIN TRANSACTION本身並不做任何事情。 'UPDATE'語句將嘗試在被更新的行(或行)上獲取**更新鎖**(U),並保持這些鎖,直到事務完成(使用「COMMIT」或「ROLLBACK」) 。 – 2012-04-12 09:05:06
@marc_s:這不是100%準確。 **(1)**通常,在讀取行時取得'U'鎖。然後,當'SQL Server'決定更新它時,通過將'U'鎖轉換爲'X'鎖在行上需要一個'X'鎖。 **(2)**但是,在某些情況下,'SQL Server'決定直接使用'X'鎖定(所以,沒有'U'鎖定,然後'U - > X'轉換)。 – 2012-04-12 09:58:11
@BogdanSahlean:好的 - 也許 - 但是'BEGIN TRANSACTION'本身並沒有做任何事情 - 這是OP的要求。對?? – 2012-04-12 10:01:59