Sql server 2008 Sql游标锁定

Sql server 2008 Sql游标锁定,sql-server-2008,cursor,locking,Sql Server 2008,Cursor,Locking,我想帮助我解决一个我无法理解msdn文档的问题。 如果我有以下sql代码: declare C1 cursor for select * from tableA open C1 fetch next from C1 into @a, @b.. while @@fetch_status = 0 .. do something very time consuming for each row fetch next from C1 into @a, @b.. end close c1 何时锁定t

我想帮助我解决一个我无法理解msdn文档的问题。 如果我有以下sql代码:

declare C1 cursor for select * from tableA
open C1
fetch next from C1 into @a, @b..
while @@fetch_status = 0
 .. do something very time consuming for each row
 fetch next from C1 into @a, @b..
end
close c1
何时锁定tableA进行更新?在游标声明期间?在开放期间,在获取期间?还是从开到关

谢谢

当运行
UPDATE
语句时,您正在更新的行将被以独占方式锁定。或者,如果您在单个事务中保存所有语句,则这些行将被独占锁定,直到事务提交(或回滚)为止


默认情况下,SQL Server使用行级锁定。但是,如果您在一个事务中进行的更新超过5000次,SQL Server可能会执行锁升级,并锁定整个相关表,以避免处理过多的单个锁。

您说得对marc\s,我已更新了它的行当
UPDATE
语句运行时,您正在更新的记录将被锁定,或者如果事务中有这些记录,那么它们将被锁定,直到事务提交(或回滚)为止,因此记录在行级别而不是表级别被锁定?PS:我没有对表进行更改,基于@A,我在数据库中的其他表中进行更改是的,默认情况下,SQL Server仅使用行级锁定。如果您在一个事务中进行了超过5000次更新,SQL Server可能会执行锁升级并锁定整个相关表,以避免处理太多的单个锁,您能否将其复制到一个答案中,以便我可以关闭此问题?我有点困惑,因为问题中的代码中没有
UPDATE
语句。是否有一个隐式的
更新
呢?@JohnHenderson:嗯,OP确实说过:tableA什么时候被锁定进行更新?所以我假设他没有显示的部分将包含一个或多个
UPDATE
语句…我明白了。我把“tableA何时被锁定用于更新?”理解为“tableA何时被另一个命令锁定用于更新?”。我看到了另一种解读(“什么时候tableA被游标while循环中的语句锁定以进行更新?”)是可能的,但我认为情况并非如此,因为在关于这个问题的一条评论中,海报上写道“PS:我没有对表进行更改,基于@A,我在数据库中的其他表中进行更改”。