我在我的存储过程中使用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