Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# BEGIN事务是否执行任何类型的行/列锁定?_C#_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

C# BEGIN事务是否执行任何类型的行/列锁定?

C# BEGIN事务是否执行任何类型的行/列锁定?,c#,sql,sql-server,sql-server-2008,tsql,C#,Sql,Sql Server,Sql Server 2008,Tsql,我在存储过程中使用begin事务。我有更新数据的代码: UPDATE employee SET name = @name, surname = @surname WHERE empId = @empid; SQL Server是否对正在更新的行或列执行任何锁定?如果不是这样,我如何防止其他用户在当前更新进行中进行另一次更新?它不必出现在存储过程中,C#也是一个选项。如果这是存储过程中的唯一语句,那么它就是一个事务。请记住,每一条语句都是原子的,无论是否有

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

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

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

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

SQL Server确实会对正在访问的对象发出锁定,而锁定在幕后发生的事情会变得相当复杂

对于特定的update语句,假设正在更新一行

  • 行:Update Lock以获得更新数据的访问权,然后在修改数据时将数据转换为独占锁

  • Page:Intent Update,当数据被修改时,它将转换为Intent Exclusive

  • 表:意向更新

关于MS站点上的锁定模式有很多详细信息:

默认情况下,MSSQL为UPDATE语句创建行级锁定。所有受UPDATE语句影响的行都将被锁定,以便在更新过程中其他用户无法修改这些行


您可以通过使用锁定提示来修改默认的锁定行为:

No-BEGIN事务本身不起任何作用。
UPDATE
语句将尝试获取正在更新的行上的更新锁(U),并保留这些锁直到事务完成(使用
COMMIT
ROLLBACK
)。(1) 通常,在读取行时执行
U
锁定。然后,当
SQL Server
决定更新时,它通过将
U
锁转换为
X
行上的锁来获得
X
锁。(2) 但是,在某些情况下,
SQL Server
决定直接获取一个
X
锁(因此,不使用
U
锁,然后进行
U->X
转换)。@BogdanSahlean:好的-也许吧-但是
开始事务本身没有任何作用-这才是OP真正要求的。对吧???@marc_s:严格地说,是的。但是显式事务(
BEGIN trans…
)+另一个事务隔离级别(例如
SERIALIZABLE
)可以更改
U
锁的生命周期,直到事务结束(
COMMIT
ROLLBACK
)。也许这方面对OP很重要(这只是一个假设)。@BrendanVogt:OP=原创海报-在本例中:你!:-)