关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » SQL Server »动手实战SQL Server死锁

    动手实战SQL Server死锁

    2014-03-17 10:34:00 出处:ITJS
    分享

    既然有了这个需求,那么要想解决死锁就需要对死锁的相关知识有一定的了解,对于非DBA的来讲并不需要了解的特别深,知道基本概念以及常见分析方法即可,毕竟我们不靠这个吃饭,没必要达到特别细的境界。这里我找到了一个微软MVP写的一系统博客,对我理解死锁非常重要,这里分享下目前我为解决死锁所采用过的方案。

    压力测试的业务场景:

    1.模拟用户提交申请

    a)  涉及到的表

    i. 申请主表,一次申请生成一条数据。

    ii. 申请的医生明细,一次申请包含多个医生,一个申请包含100个医生

    iii. 单个医生明细,每个医生一条明细数据

    综上所述一条申请的创建,需要插入201条数据。

    b)   申请逻辑

    i.  首先调用保存

    ii.  然后执行提交逻辑

    各种逻辑验证,这是历史原因造成的(一个维护了几年的项目代码逻辑的混乱是难以想象的),总是在提交数据时做双重较验 ,比如数据是否有重复行的逻辑,这里会反复读取申请医生表以及医生明细这两个申请明细子表。这也是产生死锁的主要原因,此场景已经满足了同时读取以及修改同一表的情况。除此还会往其它表中插入数据,比如一些状态跟踪信息,发邮件等。

    至于为什么被分割成两个逻辑来处理这原本是同一动作的需求,已经法考正最初的设计者了,这些逻辑包含各种EntityFramwork的查询写法,很难做有效的优化。

    2. 压力设置

    a)  并发8个用户

    b)  每1分钟增加5个用户

    曾经学过的方法:

    降低事务隔离级别为read uncommitted,结果是并不能消除死锁,但死锁的次数有所降低,主要时共享锁引发的死锁次数降低了。

    分段分析法,也可以说是排除法。只执行一部分逻辑,比如我们上面的一个申请分为两步,先保存后提交,只保存的结果是死锁依旧。

    寻找死锁跟踪的方法,试图寻找死锁的本质原因。我简单的按我自己的理解翻译了一些MVP写的文章,大家可以参考 。

    [翻译]:SQL死锁-锁的类型

    解释了SQL 中的各种锁以及它们之间的兼容性,只有了解了这些才能知道锁发生的场景,比如知道了共享锁之间是兼容的就能马上反应出纯读的操作是不会发生阻塞的

    [翻译]:SQL死锁-锁与事务级别

    事务隔离级别的不同会影响锁的行为,其中重要说明了降低事务隔离级别并不能消除死锁

    [翻译]:SQL死锁-阻塞

    只有出现了阻塞才会升级成死锁,所有了解阻塞是第一件事

    [翻译]:SQL死锁-阻塞探测

    这篇通过两种方式说明如何去跟踪分析死锁的本质原因,通过SQL自带的性能监控工且可以很方便的导出出现死锁的相关信息

    [翻译]:SQL死锁-为什么会出现死锁

    这篇非常详细的说明了死锁产生的原理

    死锁文章的重要结论:

    大部分死锁是因为未经过优化的查询导致的,但因为我们项目在处理这个申请的逻辑中有太多逻辑,不太可能在短时间内进行有效的优化,所以我暂时采用了一个也许不是很好的方案,即想办法降低排它锁的相互竞争,说的简单点说是在程序中通过一定的手段避免并发去调用更新或者插入数据的逻辑。

    偏门解决方案:

    通过一个取票排队的队列去解决数据插入以及更新的并发,原理就是一个线程想要插入数据时,先取票然后排队,当号轮到它时才能执行数据库操作,其它线程正在执行时,我们通过自族锁来实现排队。这个方法最大程序上解决死锁的问题,但不推荐这么做,之所以采用这种非常规手段,也是受制于现有程序的逻辑。假如大家在EF中也解决过死锁问题,可将经理分享给我。

    public   int AddWithSpinLock(ObjectModel.Request svarRequest)  {      bool lockTaken = false;      svarRequest.Ticket = Guid.NewGuid();      var newRequestId = 0;      try      {          _spinlock.Enter(ref lockTaken);          _queue.Enqueue(svarRequest);          while (null != _queue && _queue.Count > 0 && _queue.Peek().Ticket == svarRequest.Ticket)          {              // do something<br>                    _queue.Dequeue();              return newRequestId;          }      }      catch (Exception ex)      {          if (lockTaken) _spinlock.Exit(false);          _queue.Dequeue();          throw ex;      }      finally      {                         if (lockTaken) _spinlock.Exit(false);      }      return newRequestId;  } 

    原文链接:http://www.cnblogs.com/ASPNET2008/p/3604335.html

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    帝国CMS7.5编辑器上传图片取消宽高的三种方法

    帝国cms如何自动生成缩略图的实现方法

    Windows 12即将到来,将彻底改变人机交互

    帝国CMS 7.5忘记登陆账号密码怎么办?可以phpmyadmin中重置管理员密码

    帝国CMS 7.5 后台编辑器换行,修改回车键br换行为p标签

    Windows 11 版本与 Windows 10比较,新功能一览

    Windows 11激活产品密钥收集及专业版激活方法

    如何从 Windows 11 中完全删除/卸载 OneNote?无解!

    抖音安全与信任开放日:揭秘推荐算法,告别单一标签依赖

    ultraedit编辑器打开文件时,总是提示是否转换为DOS格式,如何关闭?

    IT头条

    华为Pura80系列新机预热,余承东力赞其复杂光线下的视频拍摄实力

    01:28

    阿里千问3开源首战告捷:全球下载破千万,国产AI模型崛起新高度!

    01:22

    DeepSeek R1小版本试升级:网友实测编程能力已达到国际一线水平

    23:15

    NVIDIA 与 Dell 合作,大规模交付 Blackwell AI 系统

    20:52

    Cerebras 以最快的 Llama 4 Maverick 性能引领 LLM 推理竞赛

    20:51

    技术热点

    PHP中的随机性——你觉得自己幸运吗?

    搞定Ubuntu Linux下WPA无线上网

    Java使用内存映射实现大文件的上传

    MySQL安全性指南

    MySQL两项性能的基本测试浅谈

    教您使用UniqueIdentifier选取SQL Server主键

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。