2012-04-12 51 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中的唯一声明,那么它是一个事务。请记住,每条语句都是原子语言,无论是否工作,您都不需要担心锁定问题。

相关问题