(转)关于Update语句的锁

摘要:
图)设置sqlprofiler的Lock项目

原文地址: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锁会在数据读取完后马上释放
如下图
(转)关于Update语句的锁第1张
如果你没有执行commit语句,可以使用SP_Lock查看update查询进程的锁情况
(转)关于Update语句的锁第2张
这个时候当语句B执行时,B需要在每行上获取一次U锁,这个时候就会碰到上面未释放的X锁定行
(转)关于Update语句的锁第3张

当然如果语句B中的where 条件使用的是索引列,那么语句B只会在索引涉及的列上加U锁,如果A,B更新查询的影响行无交集那么A,B查询互不影响。
图)设置sql profiler的Lock项目
(转)关于Update语句的锁第4张

免责声明:文章转载自《(转)关于Update语句的锁》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇spring-kafka生产者消费者配置详解Selenium:元素等待的4种方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

自动化工作之自动更新SVN

任务计划程序 任务计划程序是Window自带的组件 微软文档 http://windows.microsoft.com/zh-cn/windows-vista/automate-tasks-with-task-scheduler-from-windows-vista-inside-out 打开方法 方法一:开始菜单 控制面板 管理工具 任务计划程序 方法...

for update被锁定解锁

 查找被锁定的表,用户,session:SELECT object_name, machine, s.sid, s.serial#FROM gv$locked_object l, dba_objects o, gv$session sWHERE l.object_id = o.object_idAND l.session_id = s.sid;释放锁,杀死...

使用golang理解mysql的两阶段提交

使用golang理解mysql的两阶段提交 文章源于一个问题:如果我们现在有两个mysql实例,在我们要尽量简单地完成分布式事务,怎么处理? 场景重现 比如我们现在有两个数据库,mysql3306和mysql3307。这里我们使用docker来创建这两个实例: # mysql3306创建命令 docker run -d -p 3306:3306 -v /U...

SQL Server 触发器

SQL Server 触发器 触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用。 Ø 什么是触发器 触发器对表进行插入、更新、删除的时候会自动执行的特殊存储过程。触发器一般用在check约束更加复杂的约束上面。触发器和普通的存储过程的区别是:触发器是当对某...

mysql开发总结

一、理解MySQL基本概念   1、MySQL软件:MySQL实际上就是一软件,是一工具,是关系型数据库管理系统软件   2、MySQL数据库:就是按照数据结构来组织、存储和管理数据的仓库   3、MySQL数据库实例:     ①MySQL是单进程多线程(而oracle是多进程),也就是说MySQL实例在系统上表现就是一个服务进程,即进程;     ②M...

svn基本命令使用

1、svn help:可以通过该命令查看svn的所有操作命令,包括命令的缩写 2、首先需要从svn库中checkout对应的项目:  (1)svn项目路径为svn://192.168.1.1/myproject/doc,将项目路径下的文件checkout到/home/test目录下,若没有/home/test路径会自动创建,同时只将doc中的子目录和文件...