SQL Server中的SELECT会阻塞SELECT相关资料

2018-12-08 09:09:45 来源:互联网作者:佚名 人气: 次阅读 363 条评论

文章主要给大家介绍了SQL Server中的SELECT会阻塞SELECT的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧前言在SQL Server中...

文章主要给大家介绍了SQL Server中的SELECT会阻塞SELECT的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧

前言

在SQL Server中,我们知道一个SELECT语句执行过程中只会申请一些意向共享锁(IS) 与共享锁(S), 例如我使用SQL Profile跟踪会话86执行SELECT * FROM dbo.TEST WHERE OBJECT_ID =1 这个查询语句,其申请、释放的锁资源的过程如下所示:

而且从最常见的锁模式的兼容性表,我们可以看到IS锁与S锁都是兼容的,也就是说SELECT查询是不会阻塞SELECT查询的。

 

现有的授权模式

请求的模式

IS

S

U

IX

SIX

X

意向共享 (IS)

共享 (S)

更新 (U)

意向排他 (IX)

意向排他共享(SIX)

排他 (X)

 

 

但是在某些特殊场景。你会看到SELECT语句居然“阻塞”SELECT操作,那么SQL Server中SELECT会真的阻塞SELECT操作吗?我们先构造测试的案例场景,那么先准备测试数据吧

  1. CREATE TABLE TEST (OBJECT_ID INT, NAME VARCHAR(8));
  2. CREATE INDEX PK_TEST ON TEST(OBJECT_ID)
  3. DECLARE @Index INT =0;
  4. WHILE @Index < 20
  5. BEGIN
  6.  INSERT INTO TEST
  7.  SELECT @Index, 'kerry';
  8.  SET @Index = @Index +1;
  9. END

在会话窗口A中,执行下面SQL语句,模拟一个UPDATE语句正在执行

  1. BEGIN TRANSACTION
  2.   
  3.  UPDATE dbo.TEST SET NAME='Kerry' WHERE OBJECT_ID=1;
  4.  --ROLLBACK;

会话窗口B中,执行下面的SQL语句

  1. SELECT * FROM dbo.TEST WHERE OBJECT_ID=1

会话窗口C中,执行下面的SQL语句

  1. SELECT * FROM dbo.TEST WHERE OBJECT_ID=1

我实验的场景下,会话窗口A的会话ID为85,会话窗口B的会话ID为90,会话窗口C的会话ID为87,如下所示

如下所示,你会看到SELECT语句“阻塞”了SELECT语句,即会话90“阻塞”了会话87, 它们的等待事件都为LCK_M_S,也就是说它们都在等待获取共享锁,也许你会置疑这个SQL是否有问题,那么我们使用SP_WHO来查看,你会发现也是如此,如下所示:

如下所示,我们会发现会话ID为90 、87的会话都在等待类型为RID,Resource为1:24171:1的共享锁

其实应该说,会话87、90都在等待RID对象的共享锁,我们知道共享锁与意向共享锁都是兼容的,所以SELECT是不会阻塞SELECT的,那么又怎么解释这个现象呢?在宋大神的指点下,粗略的翻了Database System Implementaion这本书(很多原理性知识,看起来相当吃力)。里面介绍了在锁表(lock table)以及Element Info、Handling Lock Requests、Handling Unlocks等概念,有一个有意思的图所示,

 

在锁表(lock table)里,elements info里的锁的申请是在一个类似队列的结构。先进先出机制,所以当会话90先进入队列,它在等待共享锁(S), 会话87也进入队列等待共享锁(S),而且它在会话90的后面(即会话90这个elements info后面的Next指针指向会话87会话的事务),由于两个会话都被阻塞,这两个会话的Wait字段都是Yes,由于内部某些机制,会话87显示阻塞它的会话为90(这个是我个人臆测,实际具体原因有待考究),实质阻塞的源头还是会话85. 当会话85释放排它锁(X)后,会话队列根据下面几个原则来处理解锁(Handling Unlocks):

1: First-come-first-served: Grant the lock request that has been waiting the longest. This strategy guarantees no starvation, the situation where a transaction can wait forever for a lock

先来先服务(队列的原则):授予锁等待时间最长的锁请求,这种策略保证不会饿死(翻译感觉不贴切),即一个事务不会永远等待锁的情况。

2. Priority to shared locks: First grant all the shared locks waiting. Then,grant one update lock, if there are any waiting. Only grant an exclusive lock if no others are waiting. This strategy can allow starvation, if a transaction is waiting for a U or X lock.

共享锁优先,首先授予所有等待共享锁(S),然后授予其中一个更新锁(U),如果有其它类型等待,只有在没有其它锁等待时,才授予排它锁、这一策略允许等待更新锁或排它锁的事务饿死(结束)

3. Priority to upgrading: If there is a transaction with a U lock waiting to upgrade it to an X lock, grant that first. Otherwise, follow one of the other strategies mentioned.

锁升级优先,如果有一个持有共享锁(U)等待升级Wie排他锁(X),那么先授予它排它锁,否则采用前面已经提到的策略中的一个。

按照这些原则,当会话85释放了排它锁(X)后,调度器(Scheduler)应该会根据先后顺序依次授予会话90、87共享锁(S),两者的阻塞会几乎同时消失。 这个可以也可以通过实验进行一个大概的推断, 在上面实验中,你可以手工取消90会话的查询操作,然后再查看阻塞情况,就会发现会话87被85阻塞了。这个阻塞的源头就变成了85,而不是90了。

PS:上面是个人结合一些知识和理解,做的一些肤浅的判断与分析,如果不对的地方,敬请指正!

参考资料:

Database System Implementaion

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家的支持。

您可能感兴趣的文章

相关文章

  • 利用数据库trigger对安全进行监控

    利用数据库trigger对安全进行监控

      最近帮一个朋友看他们的网站安全问题,他们非常担心系统中的数据被篡改,因为一旦篡改可能就别人兑换东西或者套现走了就会造成损失,而最典型的修改一般都是利用事务性不一致和一些数据库中的溢出等错误和直接获取权...

    网络安全 2016-10-20
  • 完成Excel动态链接外部数据库

    完成Excel动态链接外部数据库

    我们有时需要在Excel中调取其他数据库的数据,并且希望其他数据库数据改变时,Excel中调取的数据也随之动态改变。下面介绍在Excel中通过“新建数据库查询”(MicrosoftQuery)的方法来实现动态链接数据库。...

    Excel教程 2016-09-27
  • 6.9英寸可还行 疑华为P9 Max现身数据库

    6.9英寸可还行 疑华为P9 Max现身数据库

    中关村在线讯:众所周知,华为P9国行版将于今日在国内正式发布,按照华为的一贯风格,在P9发布之后,很可能会再发布青春版以及Max版本,而后者的身影近日已经在GFXBench跑分数据库中出现了。疑似华为P9Max现身数据库。...

    资讯 2016-04-15
  • 美国一数据库泄露 近2亿选民个人信息曝光

    美国一数据库泄露 近2亿选民个人信息曝光

    新华网北京12月29日电美国计算机安全专家29日说,存储美国选民个人资料的一个数据库在网络上遭到公开,约1.91亿选民的个人信息外泄,原因或为数据库设定错误。【信息泄露?...

    资讯 2015-12-29
  • Valve半条命3存在?Steam数据库泄密

    Valve半条命3存在?Steam数据库泄密

    半条命》的开发商Valve一直没有透露游戏的续作是否还在开发,但不久前,Steam数据库泄漏却可能让我们对半条命3》再燃起一丝希望:Steam数据库中赫然可见半条命3》的相关信息,而上传时间则是一个月之前。。...

    网络游戏 2015-12-07
  • 百度竞价如何结合营销QQ数据库做网络营销

    百度竞价如何结合营销QQ数据库做网络营销

    一直不愿意分享项目,为什么?对于大部分在找项目的或者没有经验的人来说,给他们看再多的项目也是徒劳的,最多头脑上面爽了一把,“原来项目还可以这样做,明天我一定要如...