C# BEGIN事务是否执行任何类型的行/列锁定?
我在存储过程中使用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#也是一个选项。如果这是存储过程中的唯一语句,那么它就是一个事务。请记住,每一条语句都是原子的,无论是否有
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=原创海报-在本例中:你!:-)