|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
Cluster/NDB高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用11.5.1锁的观点
锁(Lock)是在多用户情况下对资本会见的一种限定。机制当对一个数据源加锁后,此数据源就有了必定的会见限定。我们就称对此数据源举行了“锁定”。在SQLServer中,能够对以下的工具举行锁定:<P>
- 数据行(Row):数据页中的单行数据;
- 索引行(Key):索引页中的单行数据,即索引的键值;
- 页(Page):页是SQLServer存取数据的基础单元,其巨细为8KB;
- 盘区(Extent):一个盘区由8个一连的页构成;
- 表(Table);
- 数据库(Database)。
11.5.2锁的种别
在SQLServer中,锁有两种分类办法。
(1)从数据库体系的角度来看
锁分为以下三品种型:<P>
- 独有锁(ExclusiveLock)
独有锁锁定的资本只同意举行锁定操纵的程序利用,别的任何对它的操纵均不会被承受。实行数据更新命令,即INSERT、UPDATE或DELETE命令时,SQLServer会主动利用独有锁。但当工具上有别的锁存在时,没法对其加独有锁。独有锁一向到事件停止才干被开释。
- 共享锁(SharedLock)
共享锁锁定的资本能够被别的用户读取,但别的用户不克不及修正它。在SELECT命令实行时,SQLServer一般会对工具举行共享锁锁定。一般加共享锁的数据页被读取终了后,共享锁就会当即被开释。
- 更新锁(UpdateLock)
更新锁是为了避免逝世锁而设立的。当SQLServer筹办更新数据时,它起首对数据工具作更新锁锁定,如许数据将不克不及被修正,但能够读取。比及SQLServer断定要举行更新数据操纵时,它会主动将更新锁换为独有锁。但当工具上有别的锁存在时,没法对其作更新锁锁定。
(2)从程序员的角度看
锁分为以下两品种型:<P>
- 悲观锁(OptimisticLock)
悲观锁假定在处置数据时,不必要在使用程序的代码中做任何事变就能够间接在纪录上加锁、即完整依托数据库来办理锁的事情。一样平常情形下,当实行事件处置时SQLServer会主动对事件处置局限内更新到的表做锁定。
- 失望锁(PessimisticLock)
失望锁对数据库体系的主动办理不伤风,必要程序员间接办理数据或工具上的加锁处置,并卖力猎取、共享和保持正在利用的数据上的任何锁。
<P>11.5.3断绝级别
断绝(Isolation)是盘算机平安学中的一种观点,其实质上是一种封闭机制。它是指主动数据处置体系中的用户和资本的相干管束干系,也就是用户和历程相互分隔,且和操作体系的回护把持也分隔来。在SQLServer中,断绝级(IsolationLevel)是指一个事件和别的事件的断绝水平,即指定了数据库怎样回护(锁定)那些以后正在被别的用户或服务器哀求利用的数据。指定事件的断绝级与在SELECT语句中利用锁定选项来把持锁定体例具有不异的效果。
在SQLServer中有以下四种断绝级:
- READCOMMITTED
在此断绝级下,SELECT命令不会前往还没有提交(Committed)的数据,也不克不及前往脏数据。它是SQLServer默许的断绝级。
- READUNCOMMITTED
与READCOMMITTED断绝级相反,它同意读取已被别的用户修正但还没有提交断定的数据。
- REPEATABLEREAD
在此断绝级下,用SELECT命令读取的数据在全部命令实行过程当中不会被变动。此选项会影响体系的效能,非需要情形最好不必此断绝级。
- SERIALIZABLE
与DELETE语句中SERIALIZABLE选项寄义不异。
断绝级必要利用SET命令来设定其语法以下:
SETTRANSACTIONISOLATIONLEVEL
{READCOMMITTED
|READUNCOMMITTED
|REPEATABLEREAD
|SERIALIZABLE}
11.5.4检察锁
能够经由过程企业办理器或存储历程来检察锁。
(1)用EnterpriseManager检察锁
在企业办理器当选择目次树窗口中“Management”文件夹下,“CurrentActivity”中的“Locks/ProcessID”节点,则能够检察以后锁定的历程;选择同级的“Locks/Object”节点下的响应字节点,则能够检察以后锁定的工具,如1-1所示。在1-1中,右键单击义务板窗口中的工具,从快速菜单当选择“属性”选项,则会呈现如1-2所示的锁的历程细节对话框。在此,能够革新或杀逝世锁的历程。
杀逝世历程还能够用以下Transact-SQL命令来举行:
KILLspid
spid是SystemProcessID,即体系历程编号的缩写,如1-1中所示。
1-2锁定的历程细节
(2)用体系存储历程Sp_lock检察锁
存储历程Sp_lock的语法以下:
sp_lockspid
SQLServer的历程编号spid能够在master.dbo.sysprocesses体系表中查到。spid是INT范例的数据,假如不指定spid,则显现一切的锁。
11.5.5逝世锁及其避免
逝世锁(Deadlocking)是在多用户或多历程情况下,为利用统一资本而发生的没法办理的争用形态,普通地讲,就是两个用户各占用一个资本,两人都想利用对方的资本,但同时又不肯保持本人的资本,就一向守候对方保持资本,假如不举行内部干与,就将一向耗下往。
逝世锁会形成资本的大批华侈,乃至会使体系溃散。在SQLServer中办理逝世锁的准绳是“就义一个比两个都逝世强”,即挑出一个历程作为就义者,将其事件回滚,并向实行此历程的程序发送编号为1205的毛病信息。而避免逝世锁的路子就是不克不及让满意逝世锁前提的情形产生,为此,用户必要遵守以下准绳:<P>
- 只管制止并发地实行触及到修正数据的语句;
- 请求每一个事件一次就将一切要利用的数据全体加锁,不然就不予实行;
- 事后划定一个封闭按次一切的事件,都必需按这个按次对数据实行封闭,比方,分歧的历程在事件外部对工具的更新实行按次应只管坚持分歧;
- 每一个事件的实行工夫不成太长,对程序段长的事件可思索将其支解为几个事件。
本章小结
本章中先容了数据更新的办法及事件和锁的观点。除利用本章报告的语句更新数据外,还可使用视图来更新数据,有关视图的使用请拜见第13章“游标和视图”。
在Windows中MySQL以服务形式存在,在使用前应确保此服务已经启动,未启动可用netstartmysql命令启动。而Linux中启动时可用“/etc/rc.d/init.d/mysqldstart"命令,注意启动者应具有管理员权限。 |
|