【发布时间】:2014-02-12 09:28:08
【问题描述】:
我有一笔交易:
BEGIN TRANSACTION
OPEN cursor
FETCH NEXT FROM cursor INTO @i
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO BigTable () VALUES ()
WAITFOR DELAY '00:01:00';
FETCH NEXT FROM cursor INTO @i
END
COMMIT;
问题是,事务锁定 BigTable 整个循环和 WAITFOR DELAY 时间。
如何防止锁定它,该表只会在INSERTs 期间被锁定?
【问题讨论】:
-
SQL Server 将使用 行级 锁定 - 除非您在单个事务中更新/插入/删除超过 5000 行 - 然后它会执行 锁定升级并锁定整个表。所以解决方案是:不要一次操作超过 5000 行 - 以少于 5000 行的批量操作
标签: sql-server transactions cursor locking