• 关于Update语句的锁


    关于Update语句的锁

    环境: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项目

     
     
    分类: MSSQL
    标签: MSSQL
  • 相关阅读:
    截屏 多难未遂
    捕捉异常
    Android中缓存记忆
    Android中的线程池
    悄悄为Android中解决部分适配问题哦!
    java中的服务端跳转与客户端跳转区别与联系
    doget(),doput()方法的使用
    基本概念--同步,异步
    java--SimpleDataFormat类
    java--9
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3145113.html
Copyright © 2020-2023  润新知