VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 数据库 > MongoDB >
  • SQL Server 2008教程之锁

并发性(concurrency)是任何数据库系统中的一个主要问题。它描述了两个或多个用户都想在同一时间里对某一数据修改时,会产生一定的并发问题。使用事务便可以解决用户存取数据时出现的这个问题,从而保持数据库的完整性和一致性。然而如果希望防止其他用户修改另一个还没完成的事务中的数据,就必须在事务中使用锁。

4.6.1并发问题

当多个用户同时访问同一数据库,并且他们的事务同时使用的数据,则就可能发生并发问题。锁能阻止4种主要问题包括:脏读、丢失更新、幻读、不一致的分析。
1.脏读
脏读是指当事务在读取一条仍处于被更改状态的数据时,就会出现这个问题。比如,事务A访问到一条数据,并对该数据进行修改,当这种修改还未提交到数据库时,事务B也访问了这条数据,并使用了事务A修改后的数据,由于该数据未提交,所以事务B使用这个数据就是脏数据,就可能产生错误的操作结果。
2.丢失更新
丢失更新是指事务A、事务B同理对一数据进行修改。当事务A把修改结果成功提交到数据以后,事务B也成功提交到数据中,那么数据库中保存则是事务B修改后的数据,而事务A修改的数据丢失。
3.幻读
幻读是指当事务不是独立执行时发生的一种现象。比如,事务A对一个表的数据进行修改,这种修改涉及到表中的全部数据行。同时,事务B也修改了这个表中的数据,但是只向表中插入了一行数据,那么,以后就会发生这样的情况:操作事务B的用户更新后,却发现表中还有尚未修改的数据行,这就是幻读。
4.不一致的分析
不一致的分析与脏读问题有关,不一致的分析是由不可重复的读取造成的。比如,编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。这样就发生了编辑人员两次读取的数据是不一样的情形。

4.6.2锁模式

在SQL Server数据库中加锁时,除了可以对不同的资源加锁,还可以使用不同程度的加锁方式。SQL Server中提供了多种锁方式,主要包括:共享锁、排它锁、更新锁、意向锁、模式修改锁、模式稳定锁和大容量更新锁。
1.共享锁
在SQL Server中,共享锁用于所有的只读数据操作。共享锁是非独占的,允许多个并发事务读取其锁定的资源。默认情况下,数据被读取后,SQL Server立即释放共享锁。例如,执行查询“SELECT * FROM AUTHORS”时,首先锁定第一页,读取之后,释放对第一页的锁定,然后锁定第二页。这样,就允许在读操作过程中,修改未被锁定的第一页。但是,事务隔离级别连接选项设置和SELECT语句中的锁定设置都可以改变SQL Server的这种默认设置。例如,“ SELECT * FROM AUTHORS HOLDLOCK”就要求在整个查询过程中,保持对表的锁定,直到查询完成才释放锁定。
2.排它锁
排它锁是为修改数据而保留的。它所锁定的资源,其他事务不能读取也不能修改。
3.更新锁
更新锁在修改操作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享锁造成的死锁现象。因为使用共享锁时,修改数据的操作分为两步,首先获得一个共享锁,读取数据,然后将共享锁升级为排它锁,然后再执行修改操作。这样如果同时有两个或多个事务同时对一个事务申请了共享锁,在修改数据的时候,这些事务都要将共享锁升级为排它锁。这时,这些事务都不会释放共享锁而是一直等待对方释放,这样就造成了死锁。如果一个数据在修改前直接申请更新锁,在数据修改的时候再升级为排它锁,就可以避免死锁。
4.意向锁
意向锁说明SQL Server有在资源的低层获得共享锁或排它锁的意向。例如,表级的共享意向锁说明事务意图将排它锁释放到表中的页或者行。意向锁又可以分为共享意向锁、独占意向锁和共享式独占意向锁。共享意向锁说明事务意图在共享意向锁所锁定的低层资源上放置共享锁来读取数据。独占意向锁说明事务意图在共享意向锁所锁定的低层资源上放置排它锁来修改数据。共享式排它锁说明事务允许其他事务使用共享锁来读取顶层资源,并意图在该资源低层上放置排它锁。
l   模式修改锁
执行表的数据定义语言操作时使用模式修改锁
l   模式稳定锁
当编译查询时,使用模式稳定锁。模式稳定锁不阻塞任何事务锁,包括排它锁。因此在编译查询时,其他事务都能继续运行,但不能在表中执行DDL操作。
l   大容量更新锁
当将数据大容量复制到表,且指定了 TABLOCK 提示或者使用 sp_tableoption 设置了 table lock on bulk 表选项时,将使用大容量更新 锁。大容量更新锁允许进程将数据并发地大容量复制到同一表,同时防止其它不进行大容量复制数据的进程访问该表。

4.6.3查看锁

对于数据管理员来说,了解服务器上正处于使用状态的锁的情况是非常必要的。
SQL Server提供了几个有用的工具,可以来了解SQL Server加锁系统上正在发生的事情。比如,使用sys.dm_tran_locks动态管理视图和使用 SQL Server Management Studio的查看加锁情况。
1.使用sys.dm_tran_locks视图
使用sys.dm_tran_locks视图可以快速了解SQL Server内的加锁情况。在默认情况下,任何一个拥有VIEW SERVER STATE 权限的用户均可以查询sys.dm_tran_locks视图。
sys.dm_tran_locks视图有两个主要用途。第一个用途是帮助数据库管理员查看服务器上的锁,如果sys.dm_tran_locks视图的输出包含许多状态为WAIT或CONVERT的锁,就应该怀疑存在死锁问题。例如,在查询窗口中输入下列语句:
select  *  from  sys.dm_tran_locks
执行该语句,运行结果如图4-15所示

图4-15 使用sys.dm_tran_locks视图
第二个用途是sys.dm_tran_locks视图可以帮助了解一条特定SQL语句所置的实际锁,因为用户可以检索一个特定进程的锁。例如,执行下面的一个事务操作语句:
USE BookDateBase
BEGIN TRAN
INSERT INTO [BookDateBase].[dbo].[Books]
     VALUES
           ('9787512500983','1988--我想和你谈谈这个世界','韩寒'
           ,'国际文化出版公司'
           ,'2010-09-01'
           ,'20.00'
           ,'小说'
           ,'中国当代小说'
           ,20
           ,'韩寒写过的最好的小说')
SELECT * FROM sys.dm_tran_locks
ROLLBACK TRANSACTION
在上述语句中,在设置了要使用的数据库之后,这个批处理首先开始一个事务,因为锁只有在当前事务运行期间才能被保持住。通过让事务保持执行,可以在SQL Server释放这前检查它们。下一条语句INSERT是实际请求锁的语句。随后一条语句是sys.dm_tran_locks视图显示当前事务的锁而使用的形式。最后的语句是回滚事务,不对数据库执行修改。执行上述语句,执行结果如图4-16所示。

图4-16 执行特定进程
2.使用SQL Server Management Studio
使用SQL Server Management Studio可以实现图形化显示加锁信息。启动SQL Server Management Studio,展开【管理】节点,在该节点下双击【活动监视器】节点。打开【活动监视器】窗口,如图4-17所示。

图4-17 【活动监视器】窗口

相关教程