首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >行锁和锁升级

行锁和锁升级
EN

Stack Overflow用户
提问于 2011-02-04 20:15:31
回答 1查看 3.6K关注 0票数 1

我试图使用rowlock来防止某些行在运行时被更新,但问题是我在运行以下代码时根本不能使用表:

代码语言:javascript
复制
set transaction isolation level repeatable read;
go

    begin try   
        begin transaction;

        insert into tableB with(rowlock)
            select * from tableA with(rowlock) where status = 1

        commit transaction;
    end try
    begin catch
        if xact_state() <> 0
        begin
            rollback transaction;
        end
    end catch;

在此事务运行时,我为两个表都运行了insert,它们都在等待事务提交。我应该怎么做才能锁定某些行进行读取和删除,同时保持表的可用性?

对于该记录,select会产生数万条记录。这些表具有聚集的主键,并且状态列具有索引。

EN

回答 1

Stack Overflow用户

发布于 2011-02-04 20:23:52

我不建议尝试单独锁定某些行。我认为你会遇到比你试图解决的更多的问题。遇到您所描述的锁定问题的原因是因为插入的行数与表中的行数相比。根据SQL Server的判断,锁从行锁升级到页锁再到表锁。

我认为您最好在小得多的事务批次中插入行,以减少锁的数量。换句话说,尝试在一个事务中一次插入100行,看看您是否获得了您认为可以接受的锁定性能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4897846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档