日期:2011-05-02 15:21:00 来源:本站整理
SQL Server数据库技术(66)[MSSQL防范]
本文“SQL Server数据库技术(66)[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
11.5.1 锁的概念
锁(Lock) 是在多用户环境下对资源拜候的一种限制.机制当对一个数据源加锁后,此数据源就有了一定的拜候限制.我们就称对此数据源举行了"锁定".在sql server中,可以对以下的对象举行锁定:
- 数据行(Row):数据页中的单行数据;
- 索引行(Key):索引页中的单行数据,即索引的键值;
- 页(Page):页是SQL Server 存取数据的基本单位,其大小为8KB;
- 盘区(Extent):一个盘区由8 个持续的页构成;
- 表(Table);
- 数据库(Database).
在SQL Server 中,锁有两种分类办法.
(1) 从数据库系统的角度来看
锁分为以下三种范例:
- 独占锁(Exclusive Lock)
独占锁锁定的资源只答应举行锁定操作的程序利用,别的任何对它的操作均不会被承受.履行数据更新号令,即INSERT、 UPDATE 或DELETE 号令时,SQL Server 会自动利用独占锁.但当对象上有别的锁存在时,无法对其加独占锁.独占锁一向到事件完毕才能被释放. - 同享锁(Shared Lock)
同享锁锁定的资源可以被别的用户读取,但别的用户不能改正它.在SELECT 号令履行时,SQL Server 普通会对对象举行同享锁锁定.普通加同享锁的数据页被读取完毕后,同享锁就会当即被释放. - 更新锁(Update Lock)
更新锁是为了避免死锁而设立的.当SQL Server 预备更新数据时,它首先对数据对象作更新锁锁定,这样数据将不能被改正,但可以读取.等到SQL Server 肯定要举行更新数据操作时,它会自动将更新锁换为独占锁.但当对象上有别的锁存在时,无法对其作更新锁锁定.
锁分为以下两种范例:
- 乐观锁(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 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 章"游标和视图".
以上是“SQL Server数据库技术(66)[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论