11.5.1 锁的概念

  锁(Lock) 是在多用户环境下对资源访问的一种限制。机制当对一个数据源加锁后,此数据源就有了一定的访问限制。我们就称对此数据源进行了“锁定”。在SQL Server中,可以对以下的对象进行锁定:

数据行(Row):数据页中的单行数据; 索引行(Key):索引页中的单行数据,即索引的键值; 页(Page):页是SQL Server 存取数据的基本单位,其大小为8KB; 盘区(Extent):一个盘区由8 个连续的页组成; 表(Table); 数据库(Database)。 11.5.2 锁的类别

  在SQL Server 中,锁有两种分类方法。

  (1) 从数据库系统的角度来看

  锁分为以下三种类型:

独占锁(Exclusive Lock)

  独占锁锁定的资源只允许进行锁定操作的程序使用,其它任何对它的操作均不会被接受。执行数据更新命令,即INSERT、 UPDATE 或DELETE 命令时,SQL Server 会自动使用独占锁。但当对象上有其它锁存在时,无法对其加独占锁。独占锁一直到事务结束才能被释放。 共享锁(Shared Lock)

  共享锁锁定的资源可以被其它用户读取,但其它用户不能修改它。在SELECT 命令执行时,SQL Server 通常会对对象进行共享锁锁定。通常加共享锁的数据页被读取完毕后,共享锁就会立即被释放。 更新锁(Update Lock)

  更新锁是为了防止死锁而设立的。当SQL Server 准备更新数据时,它首先对数据对象作更新锁锁定,这样数据将不能被修改,但可以读取。等到SQL Server 确定要进行更新数据操作时,它会自动将更新锁换为独占锁。但当对象上有其它锁存在时,无法对其作更新锁锁定。

(2)从程序员的角度看

  锁分为以下两种类型:

乐观锁(Optimistic Lock)

  乐观锁假定在处理数据时,不需要在应用程序的代码中做任何事情就可以直接在记录上加锁、即完全依靠数据库来管理锁的工作。一般情况下,当执行事务处理时SQL Server会自动对事务处理范围内更新到的表做锁定。 悲观锁(Pessimistic Lock)

  悲观锁对数据库系统的自动管理不感冒,需要程序员直接管理数据或对象上的加锁处理,并负责获取、共享和放弃正在使用的数据上的任何锁。

  11.5.3 隔离级别

  隔离(Isolation) 是计算机安全学中的一种概念,其本质上是一种封锁机制。它是指 自动数据处理系统中的用户和资源的相关牵制关系,也就是用户和进程彼此分开,且和操 作系统的保护控制也分开来。在SQL Server 中,隔离级(Isolation Level) 是指一个事务 和其它事务的隔离程度,即指定了数据库如何保护(锁定)那些当前正在被其它用户或服 务器请求使用的数据。指定事务的隔离级与在SELECT 语句中使用锁定选项来控制锁定 方式具有相同的效果。

  在SQL Server 中有以下四种隔离级:

READ COMMITTED

  在此隔离级下,SELECT 命令不会返回尚未提交(Committed) 的数据,也不能返回脏数据。它是SQL Server 默认的隔离级。 READ UNCOMMITTED

  与READ COMMITTED 隔离级相反,它允许读取已经被其它用户修改但尚未提交确定的数据。 REPEATABLE READ

  在此隔离级下,用SELECT 命令读取的数据在整个命令执行过程中不会被更改。此选项会影响系统的效能,非必要情况最好不用此隔离级。 SERIALIZABLE

  与DELETE 语句中SERIALIZABLE 选项含义相同。隔离级需要使用SET 命令来设定其语法如下:

  SET TRANSACTION ISOLATION LEVEL

  {READ COMMITTED

  | READ UNCOMMITTED

  | REPEATABLE READ

  | SERIALIZABLE }

  11.5.4 查看锁

  可以通过企业管理器或存储过程来查看锁。

  (1) 用Enterprise Manager 查看锁

  在企业管理器中选择目录树窗口中“Management” 文件夹下,“Current Activity” 中的“Locks / Process ID” 节点,则可以查看当前锁定的进程;选择同级的“Locks / Object”节点下的相应字节点,则可以查看当前锁定的对象,如图11-1 所示。在图11-1 中,右键单击任务板窗口中的对象,从快捷菜单中选择“属性”选项,则会出现如图11-2 所示的锁的进程细节对话框。在此,可以刷新或杀死锁的进程。

  杀死进程还可以用如下Transact-SQL 命令来进行:

  KILL spid

  spid 是System Process ID, 即系统进程编号的缩写,如图11-1 中所示。

  

  图11-2 锁定的进程细节

  (2) 用系统存储过程Sp_lock 查看锁

  存储过程Sp_lock 的语法如下:

  sp_lock spid

  SQL Server 的进程编号spid 可以在master.dbo.sysprocesses 系统表中查到。spid 是INT类型的数据,如果不指定spid ,则显示所有的锁。

  

  11.5.5 死锁及其防止

  死锁(Deadlocking) 是在多用户或多进程状况下,为使用同一资源而产生的无法解决的争用状态,通俗地讲,就是两个用户各占用一个资源,两人都想使用对方的资源,但同时又不愿放弃自己的资源,就一直等待对方放弃资源,如果不进行外部干涉,就将一直耗下去。

  死锁会造成资源的大量浪费,甚至会使系统崩溃。在SQL Server 中解决死锁的原则是“牺牲一个比两个都死强”,即挑出一个进程作为牺牲者,将其事务回滚,并向执行此进程的程序发送编号为1205 的错误信息。而防止死锁的途径就是不能让满足死锁条件的情况发生,为此,用户需要遵循以下原则:

尽量避免并发地执行涉及到修改数据的语句; 要求每个事务一次就将所有要使用的数据全部加锁,否则就不予执行; 预先规定一个封锁顺序所有的事务,都必须按这个顺序对数据执行封锁,例如,不同的过程在事务内部对对象的更新执行顺序应尽量保持一致; 每个事务的执行时间不可太长,对程序段长的事务可考虑将其分割为几个事务。 本章小结

  本章中介绍了数据更新的方法及事务和锁的概念。除了使用本章讲述的语句更新数据外,还可以使用视图来更新数据,有关视图的运用请参见第13 章“游标和视图”。

MS SQL入门基础:数据库中的锁相关推荐

  1. MS SQL入门基础:数据库缺省值

    缺省值(Default)是往用户输入记录时没有指定具体数据的列中自动插入的数据.缺省值对象与ALTER TABLE 或CREATE TABLE 命令操作表时用DEFAULT 选项指定的缺省值功能相似, ...

  2. MS SQL入门基础:备份和恢复系统数据库

    系统数据库保存了有关SQL Server 的许多重要数据信息,这些数据的丢失将给系统带来极为严重的后果,所以我们也必须对系统数据库进行备份.这样一旦系统或数据库失败,则可以通过恢复来重建系统数据库.在 ...

  3. MS SQL入门基础:移动数据库

    在SQL Server 中可以使用拆分(Detach)和附加(Attach)的方法来移动数据库.拆分数据库是从服务器中移去逻辑数据库,但不会将操作系统中的数据库文件删除.附加数据库将会创建一个新的数据 ...

  4. MS SQL入门基础:系统数据库

    SQL Server 2000 有四个系统数据库(System Databases):Master.Model.Msdb.Tempdb.这些系统数据库的文件存储在Microsoft SQL Serve ...

  5. MS SQL入门基础:更改数据库

    6.4.1 更改文件及其属性 可以在Enterprise Manager 中利用数据库属性设置更改数据库文件和事务日志文件,也可以用ALTER DATABASE 命令来更改数据库.ALTER DATA ...

  6. MS SQL入门基础:删除数据库

    6.5.1 用Enterprise Manager 删除数据库 在Enterprise Manager 中在所要删除的数据库上单击右键,从快捷菜单中选择"删除(Delete)"选项 ...

  7. MS SQL入门基础:打开游标

    打开游标游标在声明以后,如果要从游标中读取数据必须打开游标.打开一个Transact-SQL服务器游标使用OPEN 命令,其语法规则为: OPEN { { [GLOBAL] cursor_name } ...

  8. MS SQL入门基础:删除数据

    11.2.1 DELETE 语法 DELETE 语句用来从表中删除数据,其语法为: 各参数说明如下: FROM 此参数为可选选项,用于连接DELETE 关键字和要删除数据的对象名称. table_na ...

  9. MS SQL入门基础:管理触发器

    如果要显示作用于表上的触发器究竟对表有哪些操作,必须查看触发器信息.在MS SQL Server 中,有多种方法查看触发器信息.在本节我们将介绍两种常用的方法,即通过MS SQL Server 的管理 ...

最新文章

  1. Unity使用陀螺仪控制Camera
  2. 使用Github(基本概念实战操作)
  3. localhost方式提交作业到spark运行
  4. MFC 教程【5_MFC对象的创建】
  5. Atitit 图像处理和计算机视觉的分类 三部分 图像处理 图像分析 计算机视觉
  6. Java帮助文档的生成
  7. 51单片机汇编学习例程(6)——74HC573数码管篇
  8. Myeclipes 10 cracker.jar破解文件指定路径错误
  9. Windows下设置桌面壁纸的代码(QT版)
  10. Re:从零开始的Spring Security Oauth2(二)
  11. mysql查询选修课程的学生_[MySQL]查询学生选课的情况(一)
  12. Mr. Ms. Mrs. Miss 的区别
  13. 图文详解丨iOS App上架全流程及审核避坑指南
  14. TP5 根据是否是手机端跳转到对应模板
  15. C++ 内存泄露和检测
  16. 使用URLRewriter进行URL重写失效
  17. LC低通滤波器的截止频率与LC谐振频率的关系
  18. 计算机技术如何影响现代教育,浅谈信息技术时代对现代教育的影响
  19. Java第三章刘珊珊同学参加了Java课程的学习,她父亲和母亲承诺。
  20. 警惕AI,我搭建了一个“枪枪爆头”的视觉AI自瞄程序,却引发了一场“山雨欲来”

热门文章

  1. django框架下celery+rabbitmq+flower完成异步任务
  2. 团队作业8----第二次项目冲刺(beta阶段)5.25
  3. unity, Transform.TransformPoint(...)
  4. 浅谈javascript继承【读javascript设计模式第四章节继承有感】
  5. WEB前端 Vue.js 的发展历史
  6. (七)React使用
  7. 红帽linux cd命令,redhat linux 文件操作
  8. JavaScript第一天学习
  9. grid++中打印表格时怎么让每页有打印表头_1分钟!学会快速打印标题行,轻松搞定不加班...
  10. git提交代码报错解决方法 Git-remote Incorrect username or password ( access token )