解析:如何快速掌握SQLServer的锁机制

解析:如何快速掌握SQLServer的锁机制,第1张

解析:如何快速掌握SQLServer的锁机制,第2张

各种大型数据库使用的锁的基本理论都是一样的,只是具体实现不一样。SQL Server强调锁由系统管理。当用户有一个SQL请求时,系统会分析该请求,并在满足锁定条件和系统性能之间自动向数据库添加一个适当的锁。同时,系统在运行过程中经常会自动优化和动态锁定。对于一般用户来说,系统的自动加锁管理机制基本可以满足使用要求,但如果对数据安全性、数据库完整性、一致性有特殊要求,就需要了解SQL Server的加锁机制,掌握数据库加锁方法。

锁是数据库中一个非常重要的概念,主要用于保证多用户环境下数据库的完整性和一致性。我们知道,多个用户可以同时操作同一个数据库中的数据,会出现数据不一致的情况。也就是说,如果没有锁,并且多个用户同时访问一个数据库,当他们的事务同时使用相同的数据时,可能会出现问题。这些问题包括:更新丢失、肮脏阅读、不可重复阅读和幻觉阅读:

1.当两个或多个事务选择同一行,然后根据最初选择的值更新该行时,就会出现更新丢失的问题。每个事务都不知道其他事务的存在。的最后更新将覆盖其他公司所做的更新,这将导致数据丢失。例如,两名编辑制作了同一文档的电子副本。每个编辑独立地修改他的副本,然后保存修改后的副本,从而覆盖原始文档。最后一个保存其更改副本的编辑覆盖了第一个编辑所做的更改。如果第二个编辑器可以在第一个编辑器完成后进行更改,就可以避免这个问题。

2.脏读是指当一个事务正在访问数据并修改数据,但修改还没有提交到数据库时,另一个事务也访问了数据,然后使用了数据。因为这个数据是未提交的数据,所以另一个事务读取的数据是脏数据,基于脏数据的操作可能是不正确的。例如,一个编辑正在修改一个电子文档。在更改过程中,另一个编辑复制了文档(该副本包含了到目前为止所做的所有更改)并将其分发给目标用户。之后,第一个编辑认为当前的更改是错误的,所以他删除了编辑并保存了文档。分发给用户的文档包含不再存在的编辑,这些编辑应被视为从未存在过。如果在第一个编辑确定最终更改之前,没有人可以阅读更改后的文档,则可以避免这个问题。

3.不可重复读取是指在一个事务中多次读取相同的数据。在这个事务完成之前,另一个事务也访问相同的数据。然后,在第一事务中的两次数据读取之间,由于第二事务的修改,第一事务两次读取的数据可能不同。这样一个事务中两次读取的数据是不一样的,所以叫不可重复。例如,一个编辑读了同一个文档两次,但是在这两次之间,作者重写了文档。当编辑第二次阅读该文档时,该文档已被更改。原文阅读不可重复。如果编辑只能在作者写完之后才能阅读文档,就可以避免这个问题。

4.错觉阅读是指交易没有独立执行时出现的现象。例如,第一个事务修改了表中的数据,这个修改涉及到表中的所有数据行。同时,第二个事务也修改了这个表中的数据。这个修改是在表中插入一个新的数据行。然后以后操作第一笔交易的用户会发现表中仍然有未修改的数据行,好像产生了错觉。例如,编辑更改了作者提交的文档,但是当制作部门将其更改合并到文档的主副本中时,发现作者在文档中添加了新的未编辑材料。如果在编辑和制作部门完成对原始文档的处理之前,没有人能够向文档中添加新材料,则可以避免这个问题。

因此,处理多用户并发访问的方法是加锁。锁是阻止其他事务访问指定资源控制和实现并发控制的主要手段。当用户锁定数据库中的对象时,其他用户就不能再访问该对象。锁对并发访问的影响反映在锁的粒度上。为了控制被锁定的资源,首先要了解系统的空之间的管理。在SQL Server 2000系统中空之间的最小管理单位是页,一个页有8K。的所有数据、日志和索引都存储在页面上。另外,使用页面还有一个限制,就是一个表中的一行数据必须在同一个页面上,不能跨页。上面空页的管理单位是盘区,一个盘区是8个连续的页。表和索引的最小占用单位是范围。数据库由一个或多个表或索引组成,即多个区。一个表上的锁限制了对整个表的并发访问;面板上的锁限制了对整个面板的访问;数据页上的锁限制了对整个数据页的访问;对某一行加锁只会限制对该行的并发访问。

SQL Server 2000具有多粒度锁定,允许一个事务锁定不同类型的资源。为了最大限度地降低锁定成本,SQL Server会在适合任务的级别自动锁定资源。以更小的粒度(例如,行)锁定可以增加并发性,但是它需要更多的开销,因为如果许多行被锁定,则需要控制更多的锁。就并发性而言,更大粒度的锁定(如表)开销相当大,因为锁定整个表会限制其他事务访问表的任何部分,但所需的开销很低,因为需要维护的锁更少。SQL Server可以锁定行、页、范围、表、库和其他资源。

行是可以锁定的最小空空间,行级锁占用的数据资源最少。因此,在事务处理过程中,允许其他事务继续操作同一表或页的其他数据,大大减少了其他事务的等待时间,提高了系统的并发性。

页锁是指在事务操作的过程中,无论事务数据量多少,每次都锁定一个页面,该页面上的数据不能被其他事务操作。在SQL Server 7.0之前,使用页级锁。页级锁锁定的资源比行级锁锁定的数据资源多。在页级锁中,即使一个事务只处理一页上的一行数据,该页上的其他数据行也不能被其他事务使用。因此,当使用页级锁时,数据将被浪费,即数据将被占用但没有在同一页上使用。在这种现象下,数据的浪费最多不超过一页的数据线。

表锁也是非常重要的锁。表锁是指当一个事务操纵某个表的数据时,它会锁定数据所在的整个表,其他事务无法访问表中的其他数据。当事务中的数据量较大时,一般使用表级锁。表锁的特点是使用较少的系统资源,但是占用较多的数据资源。与行级锁和页级锁相比,表级锁占用较少的系统资源,如内存,但它占用数据资源。当使用表级锁时,可能会浪费大量数据。因为表级锁锁定了整个表,所以其他事务不能操作表中的其他数据。

面板锁是一种特殊类型的锁,只能在一些特殊情况下使用。簇锁意味着一个事务占用一个盘区,这个盘区不能同时被其他事务占用。例如,当创建数据库和表时,系统在分配物理空房间时使用这种类型的锁。系统根据盘区分配空。当系统分配空时,使用区锁来防止其他事务同时使用同一个区。当系统完成分配空时,将不再使用这种类型的范围锁。特别是,当涉及到对数据进行操作的事务时,不使用范围锁。

数据库级锁意味着锁定整个数据库,防止任何用户或事务访问锁定的数据库。数据库级锁是一种非常特殊的锁,只在数据库恢复过程中使用。这个级别的锁是一个级别的锁,因为它控制着整个数据库的操作。只要恢复数据库,就需要将数据库设置为单用户模式,这样系统就可以防止其他用户对数据库进行各种操作。

行级锁是锁的一种,因为行级锁不可能浪费被占用和未使用的数据。但是,如果用户事务频繁地对一个表中的多条记录进行操作,那么表中的许多记录将被行级锁定,数据库系统中的锁数量将急剧增加,从而增加系统负载,影响系统性能。因此,在SQL Server中,也支持锁升级。所谓锁升级,是指调整锁的粒度,用少数更高粒度的锁替换许多低粒度的锁,以降低系统负载。在SQL Server中,当一个事务中的锁太多,达到锁升级门时,系统会自动将行级锁和页锁升级为表级锁。值得注意的是,在SQL Server中,锁升级阈值和锁升级由系统自动确定,不需要由用户设置。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 解析:如何快速掌握SQLServer的锁机制

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情