SQL Server 锁

简介

SQL Server通过锁,就像十字路口的红绿灯那样,告诉所有并发的连接,在同一时刻上,哪些资源可以读取,哪些资源可以修改。

当一个事务需要访问的资源加了其所不兼容的锁,SQL Server会阻塞当前的事务来达成所谓的隔离性。直到其所请求资源上的锁被释放

 

如何查看锁

使用sys.dm_tran_locks这个DMV

查询时间点的数据库锁的情况,并不包含任何历史锁的记录

 

锁的粒度

锁是加在数据库对象上的。而数据库对象是有粒度的,比如同样是1这个单位,1行,1页,1个B树,1张表所含的数据完全不是一个粒度的。因此,所谓锁的粒度,是锁所在资源的粒度

锁的粒度和锁的类型都是由SQL Server进行控制的

锁会给数据库带来阻塞,因此越大粒度的锁造成更多的阻塞,但由于大粒度的锁需要更少的锁,因此会提升性能。而小粒度的锁由于锁定更少资源,会减少阻塞,因此提高了并发,但同时大量的锁也会造成性能的下降

 

 

锁的升级

实际上,每个锁会占96字节的内存,如果有大量的小粒度锁,则会占据大量的内存,直到内存达到下一级别的锁容量,会自动升级成下个级别的锁

例:当我们选择300行数据时(表数据总共3W行),SQL Server会加对应行数的Key锁,共300个key锁。但是当我们需要查询6K行数据时, 此时如果用6000个键锁的话,则会占用大约96*6000=600K左右的内存, 所以为了平衡性能与并发之间的关系,SQL Server使用一个表锁来替代6000个key锁,这就是所谓的锁升级

 

 

锁模式

锁的模式决定了锁对其他任何锁的兼容级别, 如果一个查询发现请求资源上的锁和自己申请的锁兼容,那么查询就可以执行下去,但如果不兼容,查询会被阻塞。直到所请求的资源上的锁被释放
共享锁(S锁): 用于读取资源所加的锁,又称为读锁。 在同一个资源上可以加无数把S锁
排他锁(X锁): 用于数据修改,又称为写锁。 和其它任何锁都不兼容,包括其它排他锁
更新锁(U锁): 用于更新数据,更新数据时首先需要找到被更新的数据。相当于S锁和X锁的结合,可以与S锁兼容,解决了更新时不能查找数据的问题,减少死锁出现的几率,u锁和u锁之间也不兼容
  意向锁(IS,IU,IX) 相当于指示器。会在其上层添加这个锁。例如, 当我们更新一个表中的某一行时,其所在的页和表都会获得意向排他锁。 告诉其他查询这个资源的某一部分已经上锁

 

理解死锁

当两个进程都持有一个或一组锁时,而另一个进程持有的锁和另一个进程视图获得的锁不兼容时。就会发生死锁

 

 

可以看到,出现死锁后,SQL Server并不会袖手旁观让这两个进程无限等待下去,而是选择一个更加容易Rollback的事务作为牺牲品,而另一个事务得以正常执行 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值