• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > 讲解更新锁(U)与排它锁(X)的相关知识

讲解更新锁(U)与排它锁(X)的相关知识

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-05

匿名通过本文主要向大家介绍了死锁,deadlock等相关知识,希望本文的分享对您有所帮助

一直没有认真了解UPDATE操作的锁,最近在MSDN论坛上看到一个问题,询问堆表更新的死锁问题,问题很简单,有类似这样的表及数据:

CREATE TABLE dbo.tb(
     c1 int,
     c2 char(10),
     c3 varchar(10)
);
GO
DECLARE @id int;
SET @id = 0;
WHILE @id <5
BEGIN;
     SET @id = @id + 1;
     INSERT dbo.tb VALUES( @id, 'b' + RIGHT(10000 + @id, 4), 'c' + RIGHT(100000 + @id, 4) );
END;

在查询一中执行更新操作:

BEGIN TRAN
UPDATE dbo.tb SET c2 = 'xx' WHERE c1 = 2;
WAITFOR DELAY '00:00:30';
UPDATE dbo.tb SET c2 = 'xx' WHERE c1 = 5;
ROLLBACK;

在查询一执行开始后,马上在查询二中执行下面的操作

BEGIN TRAN
UPDATE dbo.tb SET c2 = 'xx' WHERE c1 = 1;
ROLLBACK;

为什么会出现死锁,如果条件改为 c1 = 4 则不会死锁。

开始的时候想得比较简单,死锁的表现是形成循环等待(对于两个查询而言,可以简单地认为就是在相互等待对方锁定资源的释放)。

对于这个例子而言,第一个查询更新两次,会先更新并锁定一条记录,然后等待第二个更新;但第二个查询只会更新一条记录,它要么与第一个查询冲突,无法获得锁,需要等待查询一完成,这个时候它并没有锁定什么;要么能够获得锁,完成更新。似乎不应该会出现死锁,死锁会不会是其他原因导致。

在自己的电脑上简单测试了一下,似乎也确实没有死锁。

但后面通过Profile跟踪更新操作的下锁情况才发现,自己的分析大错特错了。主要原因在于没有正确理解更新操作是如何用锁的。

在联机帮助上“锁模式”中有关于更新的U(更新锁)和X(排它锁)的说明

http://msdn.microsoft.com/zh-cn/library/ms175519(v=sql.105).aspx

不过说得确实挺模糊的,里面还提到了S锁,我一直以为是查询数据过程中用的S锁(也 SELECT 一样),找到满足条件的记录后用U锁,再转换为X锁做更新。

Profile(事件探查器)跟踪的结果让我知道了这是一个错误的理解,在Profile中新建一个跟踪,选择Locks中的Lock:Acquired(加锁),Lock:Acquired(释放锁)解两个事件,在筛选中设置只跟踪测试用的查询窗口对应的spid(可以执行 PRINT @@SPID获得),然后执行一个更新语句,比如 UPDATE dbo.tb SET c2 = 'xx' WHERE c1 = 3

在Profile中可以看到,对于每条记录都有加 U 锁的操作,对于不满足条件的记录,会马上释放U锁;对于满足条件的记录,最终转换为X锁。如下图所示。




注意一下,在这个跟踪结果里面,并没有出现S锁。

另外学做了一些测试:


  1. 通过加大记录量做更新测试,会发现数据扫描涉及的记录都有U锁,并不限于更新记录所在的页。这从另一个角度说明了大表中Scan 可怕。

  2. 当使用索引Scan的时候,也会通过跟踪发现所Scan的索引资源有U锁,如果更新不涉及索引变化,

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 讲解更新锁(U)与排它锁(X)的相关知识
  • MySQL死锁与日志分析
  • Mysql一次死锁排查过程的全纪录分享
  • 分享一个MySQL死锁问题解决的方法
  • MySQL死锁问题解决的代码详细介绍
  • Mysql 行级锁的使用及死锁的预防方案
  • mysql死锁几种情况的测试_MySQL
  • SQL2008中SQL应用之- 死锁(Deadlocking)
  • 利用sys.sysprocesses检查SqlServer的阻塞和死锁
  • SqlServer表死锁的解决方法分享

相关文章

  • 2017-05-11mysql实现随机查询经验谈
  • 2018-12-05详细介绍mysql5.7.17安装使用教程(图文)
  • 2018-12-05分享一个纯 Python 实现的 MySQL 客户端操作库
  • 2018-12-05SQLServer转MYSQL的方法详解
  • 2018-12-05mysql5.6在ubuntu下的docker中安装的方法详解
  • 2018-12-05MySQL数据库的备份与维护详解
  • 2018-12-05MySQL 5.7新特性| Json Column和Generated Column(下)
  • 2017-05-11Mysql命令行导入sql数据的代码
  • 2018-12-05 NoSQLUnit 0.5.0 发布,NoSQL 单元测试
  • 2018-12-05Oracle 查看imp导出文件中字符集

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • mysql下为数据库设置交叉权限的方法
    • MySQL 错误处理例子[译]
    • 远程连接mysql 授权方法详解
    • 关于各种排序的详细介绍
    • 一列保存多个ID(将多个用逗号隔开的ID转换成用逗号隔开的名称)
    • mysql中使 gtid 复制跳过错误的方法
    • 谈谈MyISAM的用法和区别文章汇总
    • sqlserver 2000中每个服务器角色的解释
    • mysql数据库分库分表技术难点解决策略
    • PL/SQL编程经验小结开发者网络Oracle

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有