BEGIN TRANSACTION是否进行任何类型的行/列锁定?

时间:2012-04-12 08:43:55

标签: c# sql sql-server sql-server-2008 tsql

我在存储过程中使用begin transaction。我有更新数据的代码:

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

SQL Server是否对正在更新的行或列进行任何锁定?如果不是这种情况,如果当前正在进行更新,我将如何阻止其他用户进行另一次更新?它不必在存储过程中,C#也是一个选项。

3 个答案:

答案 0 :(得分:3)

SQL Server确实会对正在访问的对象发出锁定 - 而且就发生的事情而言,锁定变得非常复杂。

对于您的特定更新语句,假设正在更新单行。

  • 行:更新锁定以获取访问权限更新数据,然后在修改数据时转换为独占锁定。

  • Page:Intent Update,在修改数据时转换为Intent Exclusive。

  • 表:意图更新。

有关MS站点上锁定模式的大量详细信息:http://msdn.microsoft.com/en-us/library/ms175519(v=sql.100).aspx

答案 1 :(得分:1)

默认情况下,MSSQL为UPDATE语句创建行级锁。将受到UPDATE语句影响的所有行将被锁定,以便在进行更新时没有其他用户能够修改这些行。

您可以使用锁定提示修改默认锁定行为:http://msdn.microsoft.com/en-us/library/aa213026%28v=sql.80%29.aspx

答案 2 :(得分:0)

如果这是sproc中唯一的语句,那么它就是一个事务。请记住,每个语句都是原子的,无论是否有效,您都不必担心锁定。