zoukankan      html  css  js  c++  java
  • (转)关于Update语句的锁

    原文地址:http://www.cnblogs.com/wdfrog/p/3144020.html

    环境:MSSQL2005,在Read Committed级别

    语句A:
    begin tran
    Update Table Set f1='xxx' where f2='ttt'  --更新一行或多行
    --commit;  //注意为了看到效果这里把commit注释了
    语句A影响的行集合为B

    该语句造成的影响
    1.该语句会阻塞,查询结果集合含有任意B集合中的行的select 语句

    2.该语句会阻塞,对该表其它行(B集合以外)进行Update操作的语句
    语句B:
    Update Table Set f4='xxxx' where f3='xxx' ,注意 这里的f3列上无索引,否则不会阻塞。

     问题分析:
     
    当update 语句的where条件涉及列是非索引列时,MSSQL查询引擎会执行全表扫描,在这个过程中会对每一行加上U锁,如果该行是目标行,那么U锁会升级成X锁,然后进行更新操作,而非目标行的U锁会在数据读取完后马上释放
    如下图

    如果你没有执行commit语句,可以使用SP_Lock查看update查询进程的锁情况

    这个时候当语句B执行时,B需要在每行上获取一次U锁,这个时候就会碰到上面未释放的X锁定行

    当然如果语句B中的where 条件使用的是索引列,那么语句B只会在索引涉及的列上加U锁,如果A,B更新查询的影响行无交集那么A,B查询互不影响。

    图)设置sql profiler的Lock项目

  • 相关阅读:
    mysql下载与安装
    Observable Flowable Test
    Linux 技巧:让进程在后台可靠运行的几种方法
    CallBack
    Linux内存分析
    Linux安装svn
    百度地图api
    安装Mysql官方的sakila数据库
    yii2 展示静态页面
    yii2 手动安装第三方扩展
  • 原文地址:https://www.cnblogs.com/fcsh820/p/3147427.html
Copyright © 2011-2022 走看看