随笔分类 - 05.锁,阻塞,死锁
Locking, Blocking, Deadlocking
摘要:在今天的文章里,我想谈下SQL Server里如何处理死锁。当2个查询彼此等待时会发生死锁,没有一个查询可以继续它们的操作。首先我想给你大致讲下SQL Server如何处理死锁。最后我会展示下SQL Sever里特定的死锁类型,还有你如何避免和解决它们。 死锁处理 死锁的好处是SQL Server自
阅读全文
摘要:我喜欢写死锁这个话题,因为在你写代码的时候,如果不考虑仔细,会有太多不同的方法和情况造成死锁。在今天的文章里,我想向你展示下,从同个表,用不同的顺序来读写记录时,会发生死锁的情况。 读/写死锁 下列代码展示了简单的表定义,这里我也插入2条记录。 现在假设下列情况:你有2个查询,用来读写访问记录,但你
阅读全文
摘要:今天我想谈下SQL Server里另一个非常有趣的话题:在SQL Server里停用行和页层级锁。在SQL Server里,每次你重建一个索引,你可以使用ALLOW_ROW_LOCKS 和ALLOW_PAGE_LOCKS选项来指定,SQLServer在用读写访问你的数据时,应该获得行和页锁。我们从内
阅读全文
摘要:几年前,我写了篇关于闩锁和为什么SQL Server需要它们的文章。在今天的文章里,我想进一步谈下非缓存区闩锁(Non-Buffer Latches),还有在索引查找操作期间,SQL Server如何使用它们。在这里你会学到称为闩锁耦合(Latch Coupling)的概念。 索引查找操作(Inde
阅读全文
摘要:在1年前,我写了篇在SQL Server里为什么我们需要更新锁。今天我想继续这个讨论,谈下SQL Server里的意向锁,还有为什么需要它们。 SQL Server里的锁层级 当我讨论SQL Server里的锁升级时,我从SQL Server使用的锁层级开始题,在你读或修改你的数据的时候。 当你读取
阅读全文
摘要:前段时间,我写了一些SQL Server里锁升级的基础知识,还有它是如何影响执行计划的。今天,我想进一步谈下锁升级: 锁升级什么时候发生? 通常在SQL Server里如果在SQL语句里你请求的行数超过5000(SELECT,INSERT,UPDATE,DELETE)会发生锁升级。例如当你再可重复读
阅读全文
摘要:锁升级(Lock Escalations)非常非常不好,因为最后你会是在表级别有排它或共享锁。在表级别放上这样的限制锁会降低你的并发和数据库的吞吐量。 今天我不想讨论锁升级的基本信息,今天我想详细谈下当锁升级触发时,SQL Server的这种锁行为对执行计划情况的影响。 筛选器(Filter)运算符
阅读全文
摘要:每次我讲解SQL Server之前,我都会先简单谈下当我们执行查询时,在SQL Server内部发生了什么。执行一个SELECT语句非常简单,但是执行DML语句更加复杂,因为SQL Server要修改内存中的相关页,并在事务日志里记录整个事务。 介绍完这些特定步骤后,我总会问同样的问题:当我们有个未
阅读全文
摘要:一些人总当NOLOCK查询提示是SQL Server里的加速器,因为它避免了大量的死锁情景。在这篇文章里,我想向你展示下为什么NOLOCK查询提示是个不好的想法。脏读(Dirty Reads)NOLOCK查询提示一个最大的副作用就是在你的记录集会出现所谓的脏读这个事实。我们来看下面的代码:1 BEG...
阅读全文
摘要:大家好,欢迎回到性能调优培训。今天讨论SQL Server里的死锁(Deadlocking),第5个月的培训就结束了。当2个查询彼此等待,没有查询可以继续它的工作就会发生死锁。第一步我会概括介绍下SQL Server如何处理死锁。最后我会向你展示下SQL Server里一些特定死锁,还有你如何避免并...
阅读全文
摘要:大家好,欢迎回到性能调优培训。上2个星期我们已经讨论了SQLServer里的悲观和乐观锁。今天我想谈下SQL Server里对于锁的一个特殊现象:所谓的锁升级(Lock Escalations)。在我们进入那个问题的细节前,我想先谈下SQL Server内部使用的锁层级(Lock Hierarchy...
阅读全文
摘要:在今天的文章里我会讨论下可串行化(SERIALIZABLE)隔离级别里会有的锁升级(Lock Escalations),还有你如何避免。在上个月的7月14日,我已经介绍了SQL Server里锁升级(Lock Escalations)的基本概念还有为什么需要它们。因此请你回到这个文章来理解下这个非常...
阅读全文
摘要:在今天的文章里我想谈论下在可重复读隔离级别(Transaction Isolation Level Repeatable Read)里,当你运行事务时可能引起的2类死锁。当你使用可重复读(Repeatable Read)隔离级别设置你的事务,SQL Server对读取数据把持需要的共享锁(Share...
阅读全文
摘要:在今天的文章里我想演示下SQL Server里在表上丢失索引如何引起死锁(deadlock)的。为了准备测试场景,下列代码会创建2个表,然后2个表都插入4条记录。 1 -- Create a table without any indexes 2 CREATE TABLE Table1 3 ( 4 ...
阅读全文
摘要:一个星期前,我写了关于SQL Server里闩锁(Latches)和自旋锁(Spinlocks)的文章。2个同步原语(synchronization primitives)是用来保护SQL Server里的共享数据结构,例如缓存池里的页(通过闩锁(Latches)),锁管理器哈希表里的锁(通过自旋锁...
阅读全文
摘要:大家好,欢迎回到性能调优培训。上个星期我通过讨论悲观并发模式拉开了第5个月培训的序幕。今天我们继续,讨论下乐观并发模式(Optimistic Concurrency)。行版本(Row Versioning)乐观并发模式自SQL Server 2005后引入,并基于行版本控制(Row Versioni...
阅读全文
摘要:今天我想讲解一个特别的问题,在我每次讲解SQL Server里的锁和阻塞(Locking & Blocking)都会碰到的问题:在SQL Server里,为什么我们需要更新锁?在我们讲解具体需要的原因前,首先我想给你介绍下当更新锁(Update(U)Lock)获得时,根据它的兼容性锁本身是如何应对的...
阅读全文
摘要:在上一篇文章里我讨论了SQL Server里的闩锁。在文章的最后我给你简单介绍了下自旋锁(Spinlock)。基于那个基础,今天我会继续讨论SQL Server中的自旋锁,还有给你展示下如何对它们进行故障排除。为什么我们需要自旋锁?在上篇文章我已经指出,用闩锁同步多个线程间数据结构访问,在每个共享数...
阅读全文
摘要:在今天的文章里我想谈下SQL Server使用的更高级的,轻量级的同步对象:闩锁(Latch)。闩锁是SQL Server存储引擎使用轻量级同步对象,用来保护多线程访问内存内结构。文章的第1部分我会介绍SQL Server里为什么需要闩锁,在第2部分我会给你介绍各个闩锁类型,还有你如何能对它们进行故...
阅读全文
摘要:大家好,欢迎回到性能调优培训。今天标志着第5个月培训的开始,这个月我们会谈论SQL Server里的锁、阻塞和死锁(Locking, Blocking, and Deadlocking)。SQL Server提供悲观和乐观并发控制模式,它们用来定义并发查询的执行。这期我会给你讲解悲观并发控制模式里各...
阅读全文