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数据库半同步复制
    MySQL事物
    MySQL字符编码
    MySQL用户授权
  • 原文地址:https://www.cnblogs.com/fcsh820/p/3147427.html
Copyright © 2011-2022 走看看