- 丢失更新 -- 在这种情况下,事务与事务之间没有隔离。多个事务能够读取同一份数据并且修改它。最后对数据集做出修改的事务将胜出,而其他所有事务所作的修改都丢失了。
- 脏读 -- 在这种情况下,一个事务能够读取正被其他事务修改的数据。被第一个事务读取的数据是不一致的,因为另一个事务可能会回滚所作的修改。
- 不可重复读 -- 这种情况有点类似于没有任何隔离,一个事务两次读取数据,但是在第二次读取发生前,另一个事务修改了该数据;因此,两次读取所得到的结果是不同的。因为读操作不能保证每次都是课重复进行的,这种情况被称作“不可重复读”。
- 幻读 -- 这种情况类似于不可重复读。然而,不是先前被读取的实际行在事务完成前发生了改变,而是额外的行被添加到了表中,导致第二次读取返回了不同的行集合。
(详情请参考我的另一篇blog:SQL Server 2008 R2 事务与隔离级别实例讲解)
- Read Uncommitted
- Read Committed
- Repeatable Read
- Serializable
- Snapshot
- Read Committed Snapshot
除了选择锁类型,Lock Manager还基于所执行语句的性质以及所影响的行数自动地调整锁粒度(如row, page, table)。
- 共享锁
- 更新锁
- 独占锁
- 意向锁
- 架构锁
- 大容量更新锁
- DATABASE -- 无论何时当一个SQL Server 进程正在使用除master以外的数据库时,Lock Manager为该进程授予数据库级的锁。数据库级的锁总是共享锁,用于跟踪何时数据库在使用中,以防其他进程删除该数据库,将数据库置为脱机,或者恢复数据库。注意,由于master和tempdb数据库不能被删除或置为脱机,所以不需要在它们之上加锁。
- FILE-- 文件级的锁用于锁定数据库文件。
- EXTENT -- Extent锁用于锁定extents,通常仅在空间分配和重新分配的时候使用。一个extent由8个连续的数据页或索引页组成。Extent锁可以是共享锁也可以是独占锁。
- ALLOCATION_UNIT -- 使用在数据库分配单元上。
- TABLE -- 这种级别的锁将锁定整个表,包括数据和索引。何时将获得表级锁的例子包括在Serializable隔离级别下从包含大量数据的表中选取所有的行,以及在表上执行不带过滤条件的update或delete。
- Heap or B-Tree (HOBT) -- 用于堆数据页,或者索引的二叉树结构。
- PAGE -- 使用页级锁,由8KB数据或者索引信息组成的整个页被锁定。当需要读取一页的所有行或者需要执行页级别的维护如页拆分后更新页指针时,将会获取页级锁。
- Row ID (RID) -- 使用RID锁,页内的单一行被锁定。无论何时当提供最大化的资源并发性访问是有效并且可能时,将获得RID锁。
- KEY -- SQL Server使用两种类型的Key锁。其中一个的使用取决于当前会话的锁隔离级别。对于运行于Read Committed 或者 Repeatable Read 隔离模式下的事务,SQL Server 锁定与被访问的行相关联的的实际索引key。(如果是表的聚集索引,数据行位于索引的叶级。行上在这些你看到的是Key锁而不是行级锁。)若在Serializable隔离模式下,通过锁定一定范围的key值从而不允许新的行插入到该范围内,SQL Server防止了“幻读”。这些锁因而被称作“key-range lock”。
- METADATA -- 用于锁定系统目录信息(元数据)。
- APPLICATION -- 允许用户定义他们自己的锁,指定资源名称、锁模式、所有者、timeout间隔。
人们经常以为死锁发生在数据页级或数据行级。事实上,死锁经常发生在索引页级或索引键级。下图展示了由于索引键级的竞争引发的死锁场景。
- 循环死锁 -- 两个进程请求不同资源上的锁,每一个进程都需要对方持有的该资源上的锁,这时将发生循环死锁。如下图。
- 转换死锁-- 两个或多个进程都在事务中持有同一资源上的共享锁,并且都想把它升级为独占锁,但是,谁也没法升级直到其他的进程释放共享锁。 如图所示。
- HOLDLOCK -- 在语句执行期间,或者在整个事务期间(如果语句在事务中的话)保持共享锁。该选项等同于Serializable 隔离级别。
- NOLOCK -- 使用此选项指定不对资源施加共享锁。它类似于在0隔离级别(Read Uncommitted)下运行查询。NOLOCK选项在对结果精度要求不严格的报表工作环境下很有用。
- READUNCOMMITTED -- 与指定 Read Uncommitted 隔离级别和NOLOCK提示完全一样。
- READCOMMITTED -- 与指定 Read Committed 隔离级别一样。
- READCOMMITTEDLOCK -- 当数据被读取时获得共享锁,读取完成时释放共享锁,不管是否设定了 READ_COMMITTED_SNAPSHOT 隔离级别。
- REPEATABLEREAD -- 与指定 Repeatable Read 隔离级别一样,类似于HOLDLOCK提示。
- SERIALIZABLE -- 与指定 Serializable 隔离级别一样,类似于HOLDLOCK提示。
- READPAST -- 让查询忽略被其他事务锁定的行或页,仅返回能够被读取的数据。只能用在运行于Read Committed 或 Repeatable Read 隔离级别下的事务中。
- ROWLOCK -- 强制 Lock Manager 在资源上施加行级锁而非页级锁或表级锁。
- PAGLOCK -- 强制 Lock Manager 在资源上施加页级锁而非行级锁或表级锁。
- TABLOCK -- 强制 Lock Manager 在资源上施加表级锁而非行级锁或页级锁。
- TABLOCKX -- 强制 Lock Manager 在资源上施加表级独占锁而非行级锁或页级锁。
- UPDLOCK -- 类似于HOLDLOCK,不过HOLDLOCK在资源上应用共享锁,而UPDLOCK是在事务期间应用更新锁。
- XLOCK -- 在事务期间在资源上应用独占锁。它阻止其他事务获取该资源上的锁。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。