锁的一些概念


我来抄一段书吧,来自《Microsoft SQL Server 2000宝典》

1、锁争用
在SQL SERVER中,锁的相互作用与兼容性对事务完整性和性能都有很重要的影响。一些
锁模式会排斥一些锁模式

                          锁的兼容性
------------------------------------------------------------------------------
                                T2请求
------------------------------------------------------------------------------
T1持有           |IS锁   |  S锁  |   U锁   |   IX锁  |   SIX锁   |    X锁
------------------------------------------------------------------------------
意向共享(IS)锁 |  是   |   是  |    是   |     是  |     是    |     是
-----------------------------------------------------------------------------
共享(S)锁      |  是   |   是  |    是   |     否  |     否    |     否
------------------------------------------------------------------------------
更新(U)锁      |  是   |   是  |    否   |     否  |     否    |     否
------------------------------------------------------------------------------
意向排它(IX)锁 |  是   |   否  |    否   |     是  |     否    |     否
------------------------------------------------------------------------------
意向排它共享     |  是   |   否  |    否   |     否  |     否    |     否
(SIX)锁        |       |       |         |         |           |
------------------------------------------------------------------------------
排它(X)锁      |  否   |   否  |    否   |     否  |     否    |     否
------------------------------------------------------------------------------

2、共享锁(S)
到目前为止,最常用也最为人们所滥用的锁就是共享锁,它是一个简单的“读锁”。事务
得到了共享就好比是在宣称“我正在查看这个数据”。通常多个事务可以同时查看同一组
数据,当然这最张还是要取决于隔良模式。

3、排它锁(X)
使用排它锁意味着事务正在写数据。顾名思义,对于同一数据,在同一时间只能有一个事
务持有排它锁,其他事务在排它锁持续期间不能查看该数据。

4、更新锁(U)
更新锁的名字容易引起误解。它并不是事务执行更新时所使用的锁——那应该使用排它锁
。相反,更新锁意味着事务即将要使用排它锁,它不前正在扫描数据,以确定要使用排它
锁锁定的那些行。可以将更新锁当作即将转化为排它锁的共享锁。

5、意向锁
意向锁是一种用于警示的锁,它警告其他事务即将要发生一些事情。意向锁的主要目的是
提高性能。国为所有类型和粒度的锁都可以使用意向锁,所以SQL SERVER就具有了各种各
样的意向锁。下面是给出了几个意向锁的例子:

●意向共享锁(IS)
●共享意向排它锁(SIX)
●意向排它锁(IX)

意向锁是对共享或排它锁的一个预先请求,它并没有实际对数据进行锁定。通过这种方法
,它解决了两个性能问题:层次锁定和永久锁阻塞。
如果没有意向锁,假设事务一持有一行数据的共享锁,而事务二想对整个表加上排它锁,
那它必须检查是否存在已有的表锁、扩展务区锁、页锁、行锁和键锁。
而有了意向锁,SQL SERVER就可以使用意向锁在更高的数据层次上申明锁。所以,当事务
一得到了一个行锁,它就会同时在页和表上安置意向锁。
允许获得锁的事务在更大的范围内设置意向锁的方法把原来由检查锁的事务所完成的一部
工作交由建立锁的事务来完成。这样,虽然建立锁的事务需要一次加上三个锁,但是在今
后其他事务在检查锁时就可以少做数百次的搜索工作。
意向锁还避免了一个严重的共享锁争用的问题,笔者称之为永久锁阻塞。一旦一个事务得
到了共享锁,其他事务不可以得到排它锁。试想一下这样的情形,有某个事务每隔5s加一
个共享锁,然后持有10s,而此时有另一个事务正在等待加排它锁,这将会导致什么情况
的出现呢?理论上这个修改事务将会永久的等待下去。但是,一旦一个事务得到了意向排
他锁(IX),别的进程就不可能再得到共享锁了。意向排它锁还不是一个完全的排它锁,
但它表示即将获得排它锁。

6、架构锁(Sch-M,Sch-S)
架构锁用于保护数据库的模式。在任何查询的执行期间,SQL SERVER 都会用架构稳定锁
(Sch-S)来防止数据定义语言(DDL)命令修改数据库结构。
只有在SQL SERVER 调整数据库的物理模式时才会使用架构修改锁(Sch-M)。
当SQL SERVER 向一个表中增加一列时,在模式修改操作的整个执行过程中,架构锁将会
防止所有其他的事务查看或者修改相应的数据。
原文地址:https://www.cnblogs.com/fuyingke/p/430051.html