【问题标题】:sql server update blocked by another transaction, concurrency in updatesql server更新被另一个事务阻止,更新中的并发
【发布时间】:2016-04-11 21:46:21
【问题描述】:

两个 SP 一个接一个地被执行,第二个被第一个阻塞。他们都试图更新同一张表。两个SP如下

  1. 创建过程 [dbo].[SP1]
    开始

    设置事务隔离级别快照;
    开始交易 ImpSchd

    更新表 t1 .........................................................//更新 一组 [n1,n2....n100] 条记录

    提交交易 ImpSchd
    设置事务隔离级别 已提交阅读;

    结束

2.

创建过程 [dbo].[SP2]

开始

更新表 t1 .........................................................//更新 一组 [n101,n102.....n200] 条记录

结束

我的问题是当 sp1 运行时是快照级别的隔离,为什么它会阻塞 sp2(n 两者都在更新不同的记录集)?

如果我同时为两组不同的记录运行第一个 sp 完美运行。

我该如何克服这种情况?

如果使用快照级别的隔离是为每个更新同一个表的sp设置,那么这将是一个更大的变化。

如果两个 sp 必须更新表中的相同记录,我应该如何处理(两个 sp 将更新不同的列)?

【问题讨论】:

    标签: sql-server locking


    【解决方案1】:

    隔离级别仅用于不阻塞选择,因此任何 DML 都不会受到隔离级别的影响。在这种情况下,更新需要对表、页面进行 IX 锁定,然后对行进行 xlock 进行更新。由于您正在批量更新,表由于锁升级,它本身可能已被锁定。希望这会有所帮助

    【讨论】:

    • 那么当我为两个大型记录集运行 sp1 时,如何在没有任何阻塞的情况下成功?
    • 你能澄清一下两大组记录,它们来自不同的表吗
    • 根据 cmets 更新答案
    • 仍然没有回答我的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 2010-09-08
    • 2013-09-07
    相关资源
    最近更新 更多