原文地址: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项目

(转)关于Update语句的锁的更多相关文章

  1. 关于Update语句的锁

    关于Update语句的锁 环境:MSSQL2005,在Read Committed级别 语句A:begin tranUpdate Table Set f1='xxx' where f2='ttt'  ...

  2. mysql for update语句

    我们都知道for update语句会锁住一张表,锁表的细节很多人却不太清楚,下面我们举例看下. 在表上我们有个索引,如下: 现在在我们通过索引store_id锁表: 我们再开一个客户端,还是锁住同一个 ...

  3. 一条update语句到底加了多少锁?带你深入理解底层原理

    迎面走来了你的面试官,身穿格子衫,挺着啤酒肚,发际线严重后移的中年男子. 手拿泡着枸杞的保温杯,胳膊夹着MacBook,MacBook上还贴着公司标语:"我爱加班". 面试开始,直 ...

  4. Select For update语句浅析 (转)

    Select … for update语句是我们经常使用手工加锁语句.通常情况下,select语句是不会对数据加锁,妨碍影响其他的DML和DDL操作.同时,在多版本一致读机制的支持下,select语句 ...

  5. Oracle Update 语句语法与性能分析 - 多表关联

    Oracle Update 语句语法与性能分析 - 多表关联   为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在某个业务受理子系统BSS中, SQL 代码 --客户资料表 create ...

  6. Mysql执行Update操作时会锁住表

    update tableA a,(select a.netbar_id,sum(a.reward_amt) reward_amt from tableB a group by a.netbar_id) ...

  7. ORACLE多表关联UPDATE 语句

    转载至:http://blog.itpub.net/29378313/viewspace-1064069/ 为了方便起见,建立了以下简单模型,和构造了部分测试数据:在某个业务受理子系统BSS中, SQ ...

  8. update语句的执行步骤及commit语句的执行顺序

    update语句的执行步骤和其他DML语句的执行步骤是一样的包含insert .delete语句等,执行步骤如下: 一.如果数据和回滚数据不在数据库高速缓存区中,则oracle服务器进程将把他们从数据 ...

  9. oracle执行update语句时卡住问题分析及解决办法

    转载:http://www.jb51.net/article/125754.htm 这篇文章主要介绍了oracle执行update语句时卡住问题分析及解决办法,涉及记录锁等相关知识,具有一定参考价值, ...

随机推荐

  1. FastAdmin 将 PHP 框架升级到 ThinkPHP 5.1

    FastAdmin 将 PHP 框架升级到 ThinkPHP 5.1 社区经常有人问什么时候升级到 ThinkPHP 5.1,但是 ThinkPHP 5.1 和 ThinkPHP 5.0 差别非常大, ...

  2. 提升Apache网站访问速度的优化方法

    Apache是世界使用排名第一的Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一. 在Apache服务器上怎样优化才能提高 ...

  3. Linux 自定义总线类型

    #include <linux/module.h> #include <linux/init.h> #include <linux/device.h> // 按照 ...

  4. window下安装mysql

    参考地址: https://www.cnblogs.com/lmh2072005/p/5656392.html http://www.jb51.net/article/90302.htm 一.下载安装 ...

  5. Android开发SQLite数据库的创建

    package com.example.db; import android.content.Context; import android.database.sqlite.SQLiteDatabas ...

  6. 配置MapReduce插件时,弹窗报错org/apache/hadoop/eclipse/preferences/MapReducePreferencePage : Unsupported major.minor version 51.0(Hadoop2.7.3集群部署)

    原因: hadoop-eclipse-plugin-2.7.3.jar 编译的jdk版本和eclipse启动使用的jdk版本不一致导致.  解决方案一: 修改myeclipse.ini文件即可解决. ...

  7. php去除html

    代码如下 //清除html function clearhtml($str){ $str = trim($str); $str = strip_tags($str,""); $st ...

  8. linux中keepalived实现nginx高可用配置

    linux中keepalived实现nginx高可用配置 安装keepalived 运行如下命令即可 tar -zxvf keepalived-2.0.8.tar.gz -C /usr/src cd ...

  9. 什么是DA控制

    液压系统中的DA控制: Automotive Drive control & Anti stall control 自动变速控制 & 防熄火控制 (DA控制) 1:自动(变速)驱动控制 ...

  10. 自定义inputformat和outputformat

    1. 自定义inputFormat 1.1 需求 无论hdfs还是mapreduce,对于小文件都有损效率,实践中,又难免面临处理大量小文件的场景,此时,就需要有相应解决方案 1.2 分析 小文件的优 ...