• 自动秒收录
  • 软件:1973
  • 资讯:57947|
  • 收录网站:279743|

IT精英团

SQL Server死锁

SQL Server死锁

浏览次数:
评论次数:
编辑: 阳煦
信息来源: ITPUB
更新日期: 2022-09-23 01:47:46
摘要

SQLServer死锁多个事务之间互相等待对方的资源,导致这些事务永久等待注意是永久等待,而非长事务死锁的4个条件互斥条件(Mutualexclusion):资源不能被共享,只能由一个进程使用。请

  • 正文开始
  • 相关阅读
  • 推荐作品

00-1010事务等待对方的资源,导致这些事务永远等待。注意是永久等待,不是长时间交易。

SQL Server死锁

互斥:资源不能共享,只能被一个进程使用。等待条件:已经获得资源的进程可以再次申请新的资源。无预剥夺:分配的资源不能从相应的进程中被强制剥夺。循环等待条件:系统中的几个进程形成一个循环,循环中的每个进程都在等待被相邻进程占用的资源。

死锁的4个条件

未提交读取(设置事务隔离级别未提交读取)提交读取(设置事务隔离级别已提交读取)可重复读取(设置事务隔离级别可重复读取)可序列化(设置事务隔离级别可序列化)快照(设置事务隔离级别快照)

事务隔离级别

初始数据

在默认隔离级别下,update transaction对out-of-transaction SELECT语句的影响。在sql server ssms中打开了两个连接,分别模拟事务和普通选择。以下事务只有begin,没有COMMIT或ROLLBACK,以模拟并发时多个会话同时运行的效果

执行上述事务,然后查询以下SELECT 12345/* EXAMPLE 1 */SELECT * FROM[DBO]。[客户]从[DBO]中选择*。[客户]其中ID=1 SELECT * FROM [DBO]。[客户]其中id=2 select * from [dbo]。[客户] (nolock)其中id=2,分别是执行后的结果(空白结果被阻止)

然后在事务会话中执行rollback命令,以便在正常的SELECT会话中运行下面的语句1。

ode>SELECT FROM [dbo].[customer]
  • 可以看到,这里又变成了aaa(在NOLOCK查询时这个值为Changed)
  • 结论
    • 在默认隔离级别下(READ COMMITTED),对于UPDATE过的记录,在事务范围外默认会被阻塞住
      • 同样适用于REPEATABLE READ以及SERIALIZABLE,但不适用于READ UNCOMMITTED
      • 同样适用于DELETE/INSERT记录
    • 如果在事务外部进行查询的查询条件不牵涉到事务内的更新记录,则外部查询不会被阻塞
      • 比如WHERE id=2会被阻塞
      • 比如WHERE id=3不会被阻塞
      • 比如WHERE id between 1 AND 3会被阻塞
    • 其他线下证明
      • 例子中是用了pkid来做where条件,但是用其他条件也同样适用
      • 例子中的pkid有index,但是没有index的字段同样也适用
  • SERIALIZABLE隔离等级下,对事务外的SELECT/UPDATE/DELETE影响
    • 初始数据为
    • 执行上面这个更改为serializable的事务
    • 然后在这个事务外部执行下面测试
    • 结论
      • 如果某事务是用了serializable隔离级别,则外部就无法insert任何记录到相应的表中
        • 无论insert的字段值是否落在where条件内或者外
      • 外部的UPDATE行为:同普通等级
        • 实际上DELETE行为也是
  • 默认隔离级别中插入的记录,对于外部查询的影响
    • 执行下面这些测试
    • 结论
      • 如果某事务是用了read committed隔离级别,则外部默认无法看到这些新增的记录
        • 同样适用于repeatable read以及serilizable隔离级别
      • 使用了NOLOCK关键字的查询语句能看到脏数据
  • 默认隔离级别下事务死锁例子
    • 初始数据
    • 我们在2个session中同时执行2个事务,如下
    • 结论
      • 互相等待资源的释放、同时又持有现有资源,就会造成死锁
      • 上面例子中被kill掉的事务,选择牺牲事务的算法,ms称:正常情况下,SQL Server会把它认为取消或回滚代价最小的连接作为默认的死锁牺牲品
        • 算了,不深入了
        • 知道还有个非正常情况 - 死锁优先级,后续
  • 事务优先级 - SET DEADLOCK_PRIORITY(http://msdn.microsoft.com/en-us/library/ms186736.aspx)
    • 也可以如下
    • 结论
      • SET DEADLOCK_PRIORITY可以放在SESSION的任何地方,无论是事务外还是内、前还是后
        • sqlserver探测到死锁后,会根据session的deadlock优先级来kill
      • LOW/NORMAL/HIGH
        • 分别代表
          • -5/0/5
      • 也可以使用数字
        • -10直到10
  • 避免死锁的建议

    • 把SELECT放在事务范围外
    • 将多个事务合并为一个事务
    • SELECT加With(NOLOCK)提示
    • 降低事务隔离级别, 比如READ UNCOMMITTED
    • 使用基于行版本控制的隔离级别





    本文来源https://www.cnblogs.com/aarond/p/deadlock.html
    标签:事务 死锁 级别
    如何找到性能最差的SQL Server查询
    « 上一篇 2022-09-23
    • 如何找到性能最差的SQL Server查询
      0阅读 0条评论 个赞
      我经常会被反复问到这样的问题:”我有一个性能很差的SQLServer。我如何找出最差性能的查询?“。因此在今天的文章里会给你一些让你很容易找到问题答案的信息向导。问SQLServer!SQLSe……
    • (Sql Server)数据的拆分和合并
      0阅读 0条评论 个赞
      背景:今天遇到了数据合并和拆分的问题,尝试了几种写法。但大致可分为两类:一、原始写法。二、SqlServer2005之后支持的写法。第一种写法复杂而且效率低下,不推荐。所以下面具体讲一下第二种……
    • sql server日期时间到字符串
      0阅读 0条评论 个赞
      一、sqlserver日期时间函数SqlServer中的日期与时间函数1.当前系统日期、时间selectgetdate()2.dateadd在向指定日期加上一段时间的基础上,返回新的datetime值……
    • Ubuntu上的SQL Server —— Ubuntu上的SQL Server(完整截图)
      0阅读 0条评论 个赞
      本文从零开始一步一步介绍如何在Ubuntu上搭建SQLServer2017,包括安装系统、安装SQL等相关步骤和方法(仅供测试学习之用,基础篇)。一.创建Ubuntu系统(CreateUbun……
    • SQL Server性能优化系列
      0阅读 0条评论 个赞
      这是关于SQLServer调优系列文章,以下内容基本涵盖我们日常中所写的查询运算的分解以及调优内容项,皆为原创........第一个基础模块注重基础内容的掌握,共分7篇文章完成,内容涵盖一系列基础运……
    发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表
    • 网纯原生实现时间单位定时任务执行,未依赖第三方组件
      0阅读 0条评论 个赞
      常用的定时任务组件有Quartz.Net和Hangfire两种,这两种是使用人数比较多的定时任务组件,个人以前也是使用的Hangfire,慢慢的发现自己想要的其实只是一个能够根据Cron……
    • 你知道信息架构图和功能架构图的区别吗?
      0阅读 0条评论 个赞
      .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
    • C#中的那些锁是如何保证内核态同步的?
      0阅读 0条评论 个赞
      一:背景1.讲故事其实这个问题是前段时间有位朋友咨询我的,由于问题说的比较泛,不便作答,但想想梳理一下还是能回答一些的,这篇就来聊一聊下面这几个锁。InterlockedAutoResetEvent……
    • 记录在线超时的分析和故障排除过程
      2阅读 0条评论 个赞
      .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
    • Velox简介:一个开源的统一执行引擎
      0阅读 0条评论 个赞
      •Meta正在引入Velox,这是一个开源的统一执行引擎(unifiedexecutionengine),旨在加速数据管理系统和简化其开发。•Velox正在积极开发中,Meta在2022……
    • 新Linux技术的基石| eBPF和XDP
      0阅读 0条评论 个赞
      hi,大家好,今天给大家分享的是Linux最近特别火的新技术,当前最流行Linux内核技术是什么?那就是eBPF技术,著名开源的Cilium把eBPF技术带飞,国内Linux,容器云原生等领域爱好者……
    • 数据库发展史II-数据仓库
      6阅读 0条评论 个赞
      回顾数据仓库的发展历程,大致可以将其分为几个阶段:萌芽探索到全企业集成时代、企业数据集成时代、混乱时代--"数据仓库之父"间的论战、理论模型确认时代以及数据仓库产品百家争鸣时代。数据仓库理论发展历程上……
    • SQL Server动态生成分区脚本
      0阅读 0条评论 个赞
      一、前言前段时间使用表分区比较多,虽然已经写了SQLServer合并(删除)分区解惑、SQLServer2005分区模板与实例,但是在实践中一直感觉修改SQL脚本的时间比较多,一直想抽个时间来把……
    • Ubuntu上的SQL Server —— Ubuntu上的SQL Server(完整截图)
      0阅读 0条评论 个赞
      本文从零开始一步一步介绍如何在Ubuntu上搭建SQLServer2017,包括安装系统、安装SQL等相关步骤和方法(仅供测试学习之用,基础篇)。一.创建Ubuntu系统(CreateUbun……
    • 企业操作和维护实践-丢弃docker构建
      15阅读 0条评论 个赞
      本章目录目录0x00前言简述快速介绍什么是Kaniko?为啥用Kaniko?Kaniko是如何工作的?Kaniko已知功能问题kaniko构建上下文kaniko缓存构建0x01部署使用环境……
    • 如何保持Mysql和Redis数据一致
      0阅读 0条评论 个赞
      先阐明一下Mysql和Redis的关系:Mysql是数据库,用来持久化数据,一定程度上保证数据的可靠性;Redis是用来当缓存,用来提升数据访问的性能。关于如何保证Mysql和Redis中的数据一致(……
    • 金牛座入门 MVC微服务框架开发教程:项目部署:4 微服务应用发布到Docker进行部署
      0阅读 0条评论 个赞
      前言:本篇教程,演示ASP.NETCore微服务应用程序,如何最简方式发布到Docker中部署,并运行起来。新手两个简易概念:1、映像:可以理解为Class,用于定义;2、容器:可以理解为Clas……
    • SQL SERVER存储过程学习笔记
      6阅读 0条评论 个赞
      将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来,那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。存储过程的优点1.存储……
    • 基于Flyway的数据库版本控制实践
      0阅读 0条评论 个赞
      背景大家平时在开发过程中,会用Git来进行我们的代码管理。如Git这些,使用这些版本控制系统能轻松的帮我们解决不同开发人员之间的代码冲突处理版本回退实现软件代码的CI/CD等那大家考虑过么,针对数据库……
    • Java SE 19的新特性
      0阅读 0条评论 个赞
      源码#源仓库:Github:java_new_features镜像仓库:GitCode:java_new_featuresHashMap新的构造方法#JavaSE19,构造哈希表的时候,由于有扩……
    • Sql Server连接池及其用法
      0阅读 0条评论 个赞
      其实我们一直在使用SqlServer的连接池。在连接字符串中,Pooling为是否启用连接池,默认值为true,表示启用。与连接池相关的两个重要参数是MinPoolSize和MaxPoo……
    • 【高并发】从源码角度深入分析线程池如何优雅退出
      0阅读 0条评论 个赞
      大家好,我是冰河~~在【高并发专题】中,我们从源码角度深度分析了线程池中那些重要的接口和抽象类、深度解析了线程池是如何创建的,ThreadPoolExecutor类有哪些属性和内部类,以及它们对线程池……
    • 适时变革 共创未来| 2022数字技能职业教育生态研讨会圆满落幕
      0阅读 0条评论 个赞
      2022年8月25日,由恒利联创主办的“适时而变,联创未来”2022数字技能职业教育生态研讨会在线上举行。本届大会围绕“数字技能职业教育和数字化人才培养”的话题,邀请了Oracle技术人才发展部总经理……
    • 内存泄漏——原因、避免和位置
      0阅读 0条评论 个赞
      .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
    • 简单分析下的GOLDENDB
      0阅读 0条评论 个赞
      GOLDENDB是金融行业使用的比较广泛的一个数据库产品,以前也经常有朋友希望我写几篇分析GoldenDB数据库的文章。说实在的这类文章不好写,必须对某个产品有一定程度的了解,特别是真正上手用过之后,……
    最近发布资讯
    更多