SQL Server - 5 种死锁类型及避免死锁的方法

SQL Server中的5种死锁类型

1)书签查找死锁(Bookmark lookup deadlock)

书签查找是SQL Server中常见的死锁。它是由于select语句和DML(插入、更新和删除)语句之间的冲突而发生的。通常,SQLServer选择select语句作为死锁牺牲品,因为它不会导致数据更改并且回滚很快。为避免书签查找,您可以使用覆盖索引。您也可以在select语句中使用NOLOCK查询提示,但它会读取未提交的数据。

2) 范围扫描死锁(Range scan deadlock)

有时,我们在服务器级别或会话级别使用SERIALIZABLE隔离级别。它是用于并发控制的限制性隔离级别,可以创建范围扫描锁而不是页级或行级锁。在SERIALIZABLE隔离级别中,如果数据被修改但等待在事务中提交,用户将无法读取数据。同样,如果一个事务读取数据,另一个事务不能修改它。它提供了最低的并发性,因此我们应该在特定的应用程序需求中使用此隔离级别。

3)级联约束死锁(Cascading constraint deadlock)

SQL Server通过外键约束使用表之间的父子关系。在这种情况下,如果从父表中更新或删除记录,则需要对子表进行必要的锁定以防止出现孤立记录。要消除这些死锁,应该始终先修改子表中的数据,然后再修改父数据。还可以使用DELETE CASCADE或UPDATECASCADE选项直接处理父表。还应该在外键列上创建适当的索引。

4)查询内并行死锁(Intra-query parallelism deadlock)

一旦用户向SQL查询引擎提交查询,查询优化器就会构建优化的执行计划。它可以根据查询成本、最大并行度(MAXDOP)和并行成本阈值以串行或并行顺序执行查询。

在并行模式下,SQLServer分配多个线程。有时对于并行模式下的大型查询,这些线程开始相互阻塞。最终,它转化为死锁。在这种情况下,您需要查看执行计划以及并行配置的MAXDOP和成本阈值。您还可以在会话级别指定MAXDOP来解决死锁情况。

5)反向对象顺序死锁 (Reverse object order deadlock)

在这种类型的死锁中,多个事务在T-SQL中以不同的顺序访问对象。这会导致每个会话的资源阻塞并将其转换为死锁。所以按逻辑顺序访问对象,以免导致死锁情况。

避免死锁的最佳方法

1. 尽量缩短交易时间; 这将避免在事务中长时间持有锁。

2. 在多个事务中以类似的逻辑方式访问对象。

3. 创建覆盖索引以减少死锁的可能性。

4. 创建索引以匹配外键列。 这样,您可以消除由于级联引用完整性而导致的死锁。

5. 使用SET DEADLOCK_PRIORITY会话变量设置死锁优先级。 如果设置死锁优先级,SQLServer会终止死锁优先级最低的会话。

6. 使用try-catch块利用错误处理。 您可以捕获死锁错误并在死锁牺牲品的情况下重新运行事务。

7. 将隔离级别更改为READ COMMITTED SNAPSHOT ISOLATION或SNAPSHOT ISOLATION。 这会更改SQLServer锁定机制。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容