数据库安全保护_第1页
数据库安全保护_第2页
数据库安全保护_第3页
数据库安全保护_第4页
数据库安全保护_第5页
已阅读5页,还剩97页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据库安全保护第一页,共一百零二页,编辑于2023年,星期六5.1数据库的安全性5.2完整性控制5.3并发控制与封锁5.4数据库的恢复2第二页,共一百零二页,编辑于2023年,星期六5.1数据库的安全性5.1.1数据库安全性的含义数据库的安全性是指保护数据库以防止非法使用所造成的数据泄露、更改或破坏。安全性问题有许多方面:(1)法律、社会和伦理方面时问题。(2)物理控制方面的问题。(3)政策方面的问题。(4)运行方面的问题。(5)硬件控制方面的问题。(6)操作系统安全性方面的问题。(7)数据库系统本身的安全性方面的问题。3第三页,共一百零二页,编辑于2023年,星期六5.1.2安全性控制的一般方法安全性控制是指要尽可能地杜绝所有可能的数据库非法访问。图5-1安全控制模型

4第四页,共一百零二页,编辑于2023年,星期六安全性控制的一般方法用户标识和鉴定用户存取权限控制定义视图数据加密审计(Audit)5第五页,共一百零二页,编辑于2023年,星期六用户标识和鉴定用户标识和鉴定是由系统提供一定的方式让用户标识自己的名字或身份,系统内部记录着所有合法用户的标识,每次用户要求进入系统时,由系统进行核实,通过鉴定后才提供机器的使用权。用户标识和鉴定的方法用一个用户名或用户标识符来标明用户的身份,系统以此来鉴别用户的合法性。如果正确,就可以进入下一步的核实。用户标识符是用户公开的标识,它不足以成为鉴别用户身份的凭证。常采用用户名和与口令相结合的方法。通过用户名和口令来鉴定用户的方法简单易行,但该方法在使用时,由于用户名和口令的产生和使用比较简单,也容易被窃取,因此还可采用更复杂的方法。例如预先约定好一个过程和函数,系统可提供一个随机数,用户可根据函数计算出结果,系统根据结果来辨别用户身份的合法性。6第六页,共一百零二页,编辑于2023年,星期六授权表用户标识数据对象操作类型用户存取权限控制用户存取权限指的是不同的用户对于不同的数据对象允许执行的操作权限。在数据库系统中,定义用户存取权限称为授权。这些授权定义经过编译后以一张授权表的形式存放在数据字典中。7第七页,共一百零二页,编辑于2023年,星期六数据对象操作类型模式模式建立、修改、检索外模式建立、修改、检索内模式建立、修改、检索数据表查找、插入、修改、删除属性列查找、插入、修改、删除关系系统中的存取权限8第八页,共一百零二页,编辑于2023年,星期六授权粒度越细,授权子系统就越灵活,能够提供的安全性就越完善。对于授权表,一个衡量授权机制的重要指标就是授权粒度,即可以定义的数据对象的范围,在关系数据库中,授权粒度包括关系、记录或属性。

衡量授权机制的另一个重要指标就是授权表中允许的登记项的范围。有些授权表的授权只涉及到数据名(关系或属性名),而未提到具体的值,有些授权表提供了与值有关的授权。如表5.3和表5.49第九页,共一百零二页,编辑于2023年,星期六3.定义视图为不同的用户定义不同的视图,可以限制各个用户的访问范围。通过视图机制把要保密的数据对无权存取这些数据的用户隐藏起来,从而自动对数据提供一定程度的安全保护。10第十页,共一百零二页,编辑于2023年,星期六数据加密加密的基本思想是根据一定的算法将原始数据加密成为不可直接识别的格式,数据以密文的形式存储和传输。加密方法:替换方法,该方法使用密钥将明文中的每一个字符转换为密文中的字符。转换方法,该方法将明文中的字符按不同的顺序重新排列。通常将这两种方法结合起来使用,就可以达到相当高的安全程度。11第十一页,共一百零二页,编辑于2023年,星期六审计审计功能是一种监视措施,它跟踪记录有关数据的访问活动。审计追踪把用户对数据库的所有操作自动记录下来,存放在一个特殊文件中,即审计日志中。记录的内容一般包括:操作类型(如修改、查询等),操作终端标识与操作者标识,操作日期和时间,操作所涉及到的相关数据(如基本表、视图、记录、属性等),数据的前象和后象等。12第十二页,共一百零二页,编辑于2023年,星期六使用审计功能会大大增加系统的开销,所以DBMS通常将其作为可选特征,提供相应的操作语句可灵活打开或关闭审计功能。例如:可使用SQL语句打开对表S的审计功能,对表S的每次成功的查询、增加、删除和修改操作都作审计追踪。AUDITSELECT,INSERT,DELETE,UPDATEONSWHENEVERSUCCESSFUL要关闭对表S的审计功能可以使用如下语句;NOAUDITALLONS13第十三页,共一百零二页,编辑于2023年,星期六5.1.3SQLServer2000的数据安全性机制为了实现安全性,SQLServer2000对用户的访问进行两个阶段的检验:身份验证阶段(Authentication):身份验证机制决定了用户能否连接(或登录)到SQLServer2000服务器。权限许可确认阶段(PermissionValidation):权限许可机制决定了经过了身份验证后的用户连接到SQLServer2000服务器可以执行的具体操作,包括服务器上的操作和具体的数据库上的操作。14第十四页,共一百零二页,编辑于2023年,星期六

1.Windows身份验证模式:

允许Windows操作系统用户连接到SQLServer。当使用Windows身份验证模式时,用户必须首先登录到Windows操作系统中,然后再登录到SQLServer。一般推荐使用Windows验证模式,因为这种安全模式能够与Windows操作系统的安全系统集成在一起,以提供更多的安全功能。5.1.4SQLServer2000的身份验证模式15第十五页,共一百零二页,编辑于2023年,星期六2.混合身份验证模式混合身份验证模式表示SQLServer允许Windows授权用户和SQL授权用户登录到SQLServer数据库服务器。如果希望允许非Windows操作系统的用户也能登录到SQLServer数据库服务器上,则应该选择混合身份验证模式。如果在混合身份验证模式下选择使用SQL授权用户登录SQLServer数据库服务器上,则用户必须提供登录名和密码两部分内容。16第十六页,共一百零二页,编辑于2023年,星期六

在SQLSERVER身份认证模式下,帐号和密码保存在master数据库的syslogins数据表中,当客户机使用用户帐号和密码连接数据库服务器时,在该表中查询是否有相同的帐号和密码,若有就接受连接。设置身份验证模式:1)打开企业管理器,展开“服务器组”文件夹,在服务器中单击右键,在弹出的快捷菜单中选择“编辑SQLSERVER注册属性”命令,在已注册的SQLSERVER属性对话框中设置验证模式。注意:修改验证模式后,必须首先停止SQLSERVER服务,然后重启该服务,新的设置才能生效。17第十七页,共一百零二页,编辑于2023年,星期六5.1.5SQLServer的登录账号和服务器角色在SQLServer中,账号有两种:一种是登录服务器的登录账号(LoginName),另外一种是使用数据库的用户账号(UserName)。查看服务器的登录账号方法1:使用EnterpriseManager进入EnterpriseManager,展开“SQLServer组”,找到所要连接的SQLServer服务器;展开该服务器对应的文件夹,再展开“安全性”文件夹,单击“登录”选项,即可看到系统创建的默认登录账号及已建立的其他登录账号。18第十八页,共一百零二页,编辑于2023年,星期六其中:BUILTIN\Administrators:表示所有WindowsAdiminstrators组中的用户都可以登录到SQLServer。此组中的成员同时也具有SQLServer的系统管理员权限。sa:SQLServer身份验证模式的系统管理员账户。方法2:使用存储过程查看登录账号。EXECsp_helplogins19第十九页,共一百零二页,编辑于2023年,星期六创建服务器的登录账号利用EnterpriseManage展开“安全性”,单击“登录”节点。右击内容窗格中的空白处,从弹出式菜单中选择“新建登录”命令。输入登录账号名称,单击“SQLSERVER”身份验证,并输入登录密码。然后在“默认设置”选项组中,选择对应的数据库,表示该登录账号默认登录到该数据库中。

20第二十页,共一百零二页,编辑于2023年,星期六创建服务器的登录账号利用存储过程EXECsp_addlogin'登录账号名称','密码','默认数据库名','使用的语言'[例5-1]建立了一个名称为Mike的登录账号。EXECsp_addlogin'Mike','m1934','Teach',NULL[例5-2]将MIKE登录账号加入到数据库Teach中。EXECsp_adduser‘Mike’更改登录账号的属性使用存储过程sp_password可改变登录账号的密码EXECsp_password'旧密码','新密码','登录账号名称'[例5-3]将Mike账号的密码由原来的m1934改为mike1934.EXECsp_password‘m1934’,’mike1934’,’Mike’21第二十一页,共一百零二页,编辑于2023年,星期六使用存储过程sp_addsrvrolemember可以将登录账号加入服务器的角色中EXECsp_addsrvrolemember'登录账号','服务器角色名称'[例5-4]将登录账号MIKE加入到dbcreator服务器角色中。EXECsp_addsrvrolemember‘MIKE’,’dbcreator’22第二十二页,共一百零二页,编辑于2023年,星期六删除登录账号使用EnterpriseManager使用存储过程EXECsp_droplogin'登录账号'[例5-5]从数据库Teach中删除MIKE登录账号。EXECsp_droplogin‘MIKE’SQLServer的服务器角色角色(Role)是对权限集中管理的一种机制,将不同的权限组合在一起就形成了一种角色。服务器角色是执行服务器级管理操作的用户权限的集合。23第二十三页,共一百零二页,编辑于2023年,星期六角色名称中文名字权限sysadmin系统管理员可执行任何活动serveradmin服务器管理员可设置服务器范围的配置选项,关闭服务器setupadmin安装管理员可管理连接服务器和启动过程securityadmin安全管理员可管理登录和创建数据库的权限,还可以读取错误日志和更改密码processadmin进程管理员可管理运行的进程diskadmin磁盘管理员可管理磁盘文件dbcreator数据库创建者可创建、更改和删除数据库bulkadmin批量管理员可执行大容量插入语句SQLSERVER服务器角色24第二十四页,共一百零二页,编辑于2023年,星期六5.1.6SQLServer的数据库用户账号和数据库角色数据库的用户账号用户账号要在特定的数据库内创建,并关联一个登录账号(当一个数据库的用户创建时,必须关联一个登录账号)。每个登录账号在一个数据库中只能有一个用户账号,但每个登录账号可以在不同的数据库中各有一个用户账号。注意:

master和tempdb数据库中的guest用户账号不能删除,而其他数据库中的guest用户账号可以删除。登录账号具有对某个数据库的访问权限,并不表示该登录账号对该数据库具有存取的权限。25第二十五页,共一百零二页,编辑于2023年,星期六查看数据库的用户账号方法1:使用企业管理器

展开SQLSERVER组或服务器,在“数据库”文件夹中,展开某数据库,单击“用户”选项,则在右窗格中显示出该数据库的所有用户。26第二十六页,共一百零二页,编辑于2023年,星期六创建数据库的用户账号方法1:使用企业管理器

单击要建立数据库用户的数据库节点,右击“用户”,在弹出的菜单上选择“新建数据库用户”命令。27第二十七页,共一百零二页,编辑于2023年,星期六查看数据库的用户账号方法2:利用存储过程EXECsp_helpuser创建数据库的用户账号方法2:使用存储过程EXECsp_adduser'登录账号','用户账号','所属的数据库角色’[例5-7]向当前数据库中以登录名‘ZHANGSAN’创建一个名称为ZHANGSAN的用户账号,并将该用户账号设置为db_owner角色。EXECsp_adduser‘ZHANGSAN’,’ZHANGSAN’,’db_owner’28第二十八页,共一百零二页,编辑于2023年,星期六设置数据库用户账号的权限

展开“数据库”节点并展开要设置权限的数据库,单击“用户”节点。在内容窗格中右击要设置权限的数据库用户,从弹出的菜单中选择“所有任务”下的“管理权限”命令。授予权限拒绝权限收回权限29第二十九页,共一百零二页,编辑于2023年,星期六对数据库对象的操作,具体含义如下SELECT:对表或者视图进行查询。INSERT:在表或者视图中插入记录。UPDATE:对表或者视图中的数据进行修改。DELETE:删除表或者视图中的数据。EXEC:执行存储过程。DRI:可对表的外键加以限制,以完成表的参照完整性。30第三十页,共一百零二页,编辑于2023年,星期六删除数据库用户账号存储过程 EXECsp_dropuser'用户账号'数据库角色数据库角色是对数据库对象操作的权限的集合。数据库角色可分为三种:固定的标准数据库角色(系统创建的)应用程序角色当我们打算让某些用户只能通过特定的应用程序间接地存取数据库中的数据而不是直接地存取数据库数据时,就应该考虑使用应用程序角色。31第三十一页,共一百零二页,编辑于2023年,星期六(3)public数据库角色Public数据库角色是每个数据库最基本的数据库角色,每个用户可以不属于其他9个固定数据库角色,但至少会属于public数据库角色。当在数据库中添加新用户账号时,会自动将新用户账号加入public数据库角色。32第三十二页,共一百零二页,编辑于2023年,星期六角色名称权限public最基本的数据库角色db_accessadmin可以添加或删除用户标识db_backupoperator可以发出DBCC、CHECKPOINT和BACKUP语句db_datareader可以选择(取)数据库内任何用户表中的所有数据db_datawriter可以更改数据库内任何用户表中的所有数据db_ddladmin可以发出所有DDL语句,但不能发出GRANT(授权)、REVOKE或DENY语句db_denydatareader不能选择(取)数据库内任何用户表中的任何数据db_denydatawriter不能更改数据库内任何用户表中的任何数据db_owner在数据库中有全部权限db_securityadmin可以管理全部权限、对象所有权、角色和角色成员资格33第三十三页,共一百零二页,编辑于2023年,星期六查看数据库角色的属性:以Teach数据库中的db_owner角色为例:1)在企业管理器中,展开SQLSERVER组,在数据库文件夹中,展开Teach数据库文件夹,单击“角色”选项,在右侧窗格中显示出该数据库的所有角色。2)在右侧窗格中,在“db_owner”角色上单击右键,在快捷菜单中单击“属性”,则弹出了包括在该角色中的数据库用户账号的对话框。3)单击“添加”按钮可以为该角色添加一个数据库用户;单击“删除”按钮,可从角色中删除被选中的数据库用户。34第三十四页,共一百零二页,编辑于2023年,星期六创建新的数据库角色使用企业管理器在企业管理器中,展开SQLSERVER组,在“数据库”文件夹中,展开某一数据库文件夹,然后在“角色”选项上单击右键,在弹出的快捷菜单中选择“新建数据库角色”,在该对话框中输入角色名,在“数据库角色类型”中选择角色类型为标准角色,单击“添加”按钮可向角色中添加成员。单击“确定”。使用存储过程创建新角色EXECsp_addrole'角色名','拥有者’[例5-9]在当前数据库中创建一个名为Myrole的角色EXECsp_addrole‘Myrole’,’dbo’35第三十五页,共一百零二页,编辑于2023年,星期六删除数据库角色sp_droprole'角色名'创建数据库应用程序角色sp_setapprole'应用程序角色名','密码'用户和角色的权限问题用户权限继承角色的权限数据库角色中可以包含多个用户,当用户属于某一数据库角色时,用户对数据库对象的存取权限也继承该角色的权限。36第三十六页,共一百零二页,编辑于2023年,星期六用户分属不同角色如果用户分属于不同的数据库角色,如用户User1既属于角色1,又属于角色2,则用户的权限基本上是以角色1和角色2的并集为准,但只要有一个拒绝,则用户User1的权限就是拒绝的。37第三十七页,共一百零二页,编辑于2023年,星期六5.2完整性控制5.2.1数据库完整性的含义数据库的完整性是指保护数据库中数据的正确性、有效性和相容性,防止错误的数据进入数据库造成无效操作。

数据库的完整性和安全性是数据库保护的两个不同的方面。数据库的安全性是指保护数据库以防止非法使用所造成数据的泄露、更改或破坏。安全性措施的防范对象是非法用户和非法操作。数据库的完整性是指防止合法用户使用数据库时向数据库中加入不符合语义的数据。完整性措施的防范对象是不合语义的数据。38第三十八页,共一百零二页,编辑于2023年,星期六5.2.2完整性规则的组成完整性规则主要由以下三部分构成。(1)触发条件:规定系统什么时候使用规则来检查数据。(2)约束条件:规定系统检查用户发出的操作请求违背了什么样的完整性约束条件。(3)违约响应:规定系统如果发现用户发出的操作请求违背了完整性约束条件,应该采取一定的动作来保证数据的完整性,即违约时要做的事情。完整性规则从执行时间上可分为立即执行约束(ImmediateConstraints)和延迟执行约束(DeferredConstraints)。39第三十九页,共一百零二页,编辑于2023年,星期六

立即执行约束是指在执行用户事务过程中,某一条语句执行完成后,系统立即对此数据进行完整性约束条件检查。延迟执行约束是指在整个事务执行结束后,再对约束条件进行完整性检查,结果正确后才能提交。如果发现用户操作违背了立即执行约束,则可以拒绝该操作,以保护数据的完整性。如果发现用户操作违背了延迟执行约束,而又不知道是哪个事务破坏了完整性,则只能拒绝整个事务,把数据库恢复到该事务执行前的状态。40第四十页,共一百零二页,编辑于2023年,星期六一条完整性规则可以用一个五元组(D,O,A,C,P)来形式化地表示D(Data):代表约束作用的数据对象,可以是关系、元组和列三种对象;O(Operation):代表触发完整性检查的数据库操作,即当用户发出什么操作请求时需要检查该完整性规则,是立即执行还是延迟执行;A(Assertion):代表数据对象必须满足的语义约束,这是规则的主体;C(Condition):代表选择A作用的数据对象值的谓词;P(Procedure):代表违反完整性规则时触发执行的操作过程。41第四十一页,共一百零二页,编辑于2023年,星期六完整性约束条件是完整性控制机制的核心。例如,对于“学号(SNo)不能为空”的这条完整性约束中,D、O、A、C、P的含义分别如下:D:代表约束作用的数据对象为SNo属性;O:当用户插入或修改数据时需要检查该完整性规则;A:SNo不能为空;C:A可作用于所有记录的SNo属性;P:拒绝执行用户请求。42第四十二页,共一百零二页,编辑于2023年,星期六5.2.3完整性约束条件的分类从约束条件使用的对象分值的约束和结构的约束值的约束即对数据类型、数据格式、取值范围和空值等进行规定。(1)对数据类型的约束,包括数据的类型、长度、单位和精度等。(2)对数据格式的约束。(3)对取值范围的约束。(4)对空值的约束。结构的约束即对数据之间联系的约束。(1)函数依赖约束。(2)实体完整性约束。(3)参照完整性约束。(4)统计约束。43第四十三页,共一百零二页,编辑于2023年,星期六从约束对象的状态分静态约束和动态约束静态约束静态约束是指对数据库每一个确定状态所应满足的约束条件,是反映数据库状态合理性的约束,这是最重要的一类完整性约束。上面介绍的值的约束和结构的约束均属于静态约束。动态约束动态约束是指数据库从一种状态转变为另一种状态时,新旧值之间所应满足的约束条件,动态约束反映的是数据库状态变迁的约束。例如,学生年龄在更改时只能增长,职工工资在调整时不得低于其原来的工资。44第四十四页,共一百零二页,编辑于2023年,星期六5.2.4数据完整性的实施声明式数据完整性声明式数据完整性是将数据所需符合的条件融入到对象的定义中,这样SQLServer会自动确保数据符合事先制定的条件。声明式数据完整性的特点是:①通过针对表和字段定义声明的约束,可使声明式数据完整性成为数据定义的一部分。②使用约束、默认值与规则实施声明式数据完整性。45第四十五页,共一百零二页,编辑于2023年,星期六程序化数据完整性如果所需符合的条件以及该条件的实施均通过所编写的程序代码完成,则这种形式的数据完整性称为程序化数据完整性。程序化数据完整性的特点是:①程序化数据完整性可以通过相关的程序语言及工具在客户端或服务器端实施。②SQLServer可以使用存储过程或触发器实施程序化数据完整性。46第四十六页,共一百零二页,编辑于2023年,星期六5.2.5规则规则(Rule)就是数据库对存储在表中的列或用户自定义数据类型中的值的规定和限制。规则与其作用的表或用户自定义数据类型是相互独立的,即表或用户自定义对象的删除、修改不会对与之相连的规则产生影响。创建规则1)使用企业管理器创建规则2)使用存储过程创建规则CREATERULErule_nameAScondition_expression

注意:condition_expression子句中的表达式第一个字符必须是@符号。[例5-12]创建学生年龄规则。CREATERULEage_ruleAS@age>=18and@age<=5047第四十七页,共一百零二页,编辑于2023年,星期六查看规则使用企业管理器查看规则用存储过程sp_helptext查看规则sp_helptextsp_helptext[@objname=]'name'Name指明对象的名字。可以是规则、默认、触发器等。规则的绑定与松绑创建规则后,规则仅仅是一个存在于数据库中的对象,并未发生作用。需要将规则与数据库表或用户自定义对象联系起来,才能达到创建规则的目的。所谓绑定就是指定规则作用于哪个表的哪一列或哪个用户自定义数据类型。解除规则与对象的绑定称为“松绑”。48第四十八页,共一百零二页,编辑于2023年,星期六规则对已经输入表中的数据不起作用。用存储过程sp_bindrule绑定规则sp_bindrule[@rulename=]'rule', [@objname=]'object_name' [,'futureonly'][例5-14]绑定规则age_rule到S表的字段Age。EXECsp_bindrule'age_rule','S.Age‘用存储过程sp_unbindrule解除规则的绑定sp_unbindrule[@objname=]'object_name' [,'futureonly'][例5-15]解除已绑定到S表的字段Age的规则age_rule。EXECsp_unbindrule'S.Age'49第四十九页,共一百零二页,编辑于2023年,星期六用企业管理器管理规则的绑定50第五十页,共一百零二页,编辑于2023年,星期六在删除一个规则前必须先将与其绑定的对象解除绑定。删除规则使用DROPRULE命令删除规则DROPRULE{rule_name}[,...n][例5-16]删除age_rule规则。DROPRULEage_rule51第五十一页,共一百零二页,编辑于2023年,星期六5.2.6默认默认(Default)是向用户输入记录时没有指定具体数据的列中自动插入的数据。表的一列或一个用户自定义数据类型只能与一个默认绑定。创建默认1)使用企业管理器创建默认2)使用存储过程创建默认CREATEDEFAULTdefault_nameASconstant_expression[例5-17]创建出生日期默认birthday_defa。CREATEDEFAULTbirthday_defaAS'1978-1-1'52第五十二页,共一百零二页,编辑于2023年,星期六查看和修改默认使用sp_helptext存储过程可以查看默认的信息。[例5-18]查看默认birthday_defa。EXECsp_helptextbirthday_defa默认的绑定与松绑用存储过程sp_bindefault绑定默认sp_bindefault[@defname=]'default', [@objname=]'object_name' [,'futureonly']用存储过程sp_unbindefault解除默认的绑定sp_unbindefault[@objname=]'object_name'[,'futureonly']53第五十三页,共一百零二页,编辑于2023年,星期六[例5-19]绑定默认birthday_defa到数据表S的Birthday列上。EXECsp_bindefaultbirthday_defa,'S.Birthday'[例5-20]解除默认birthday_defa与表S的Birthday列的绑定。EXECsp_unbindefault'S.Birthday'删除默认使用DROPDEFAULT命令删除默认DROPDEFAULT{default_name}[,...n][例5-21]删除学生生日默认birthday_defa。DROPDEFAULTbirthday_defa在删除一个默认前必须先将与其绑定的对象解除绑定54第五十四页,共一百零二页,编辑于2023年,星期六5.3.1数据库并发性的含义为了充分利用数据库资源,很多时候数据库用户都是对数据库系统并行存取数据,这样就会发生多个用户并发存取同一数据块的情况,彼此之间就有可能产生相互干扰的情况。如果对并发操作不加控制可能会产生不正确的数据,破坏数据的完整性。并发控制就是解决这类问题,以保持数据库中数据的一致性,即在任何一个时刻数据库都将以相同的形式给用户提供数据。5.3并发控制与封锁55第五十五页,共一百零二页,编辑于2023年,星期六事务是数据库系统中执行的一个工作单位,它是由用户定义的一组操作序列。一个事务可以是一组SQL语句、一条SQL语句或整个程序,一个应用程序可以包括多个事务。定义事务的语句有三条:BEGINTRANSACTIONCOMMITROLLBACK5.3.2事务(Transaction)事务的开始事务的提交事务的回滚56第五十六页,共一百零二页,编辑于2023年,星期六事务的特征原子性(Atomicity)一个事务是一个不可分割的工作单位,事务在执行时,应该遵守“要么不做,要么全做”(NothingorAll)的原则,即不允许完成部分的事务。一致性(Consistency)事务对数据库的作用是数据库从一个一致状态转变到另一个一致状态。所谓数据库的一致状态是指数据库中的数据满足完整性约束。隔离性(Isolation)如果多个事务并发地执行,应像各个事务独立执行一样,一个事务的执行不能被其他事务干扰。持久性(Durability)持久性指一个事务一旦提交,它对数据库中数据的改变就应该是持久的,即使数据库因故障而受到破坏,DBMS也应该能够恢复。57第五十七页,共一百零二页,编辑于2023年,星期六下面是一个事务的例子,即从账号A转移资金额R到账号BBEGINTRANSATIONREADAA←A-RIFA<0/*A余额不足*/THENBEGINDISPLAY“A余额不足”ROLLBACKENDELSEBEGINB←B+R58第五十八页,共一百零二页,编辑于2023年,星期六DISPLAY“拨款完成”COMMITEND该事务有两个出口:当A余额不足时,事务以ROLLBACK(撤销)命令结束,即撤销该事务的影响;另一个出口是以COMMIT(提交)命令结束,完成拨款。在COMMIT之前,即在数据库修改过程中,数据可能是不一致的,事务本身也可能被撤销。只有在COMMIT之后,事务对数据库所产生的变化才对其他事务开放,这就可以避免其他事务访问不一致或不存在的数据。59第五十九页,共一百零二页,编辑于2023年,星期六5.3.3并发操作与数据的不一致性[例5-22]并发取款操作。假设存款余额R=1000元,甲事务T1取走存款100元,乙事务T2取走存款200元,如果正常操作,即甲事务T1执行完毕再执行乙事务T2,存款余额更新后应该是700元。但是如果按照如下顺序操作,则会有不同的结果:(1)甲事务T1读取存款余额R=1000元;(2)乙事务T2读取存款余额R=1000元;(3)甲事务T1取走存款100元,修改存款余额R=R-100=900,把R=900写回到数据库;(4)乙事务T2取走存款200元,修改存款余额R=R-200=800,把R=800写回到数据库;结果两个事务共取走存款300元,而数据库中的存款却只少了200元。得到这种错误的结果是由甲乙两个事务并发操作引起的。60第六十页,共一百零二页,编辑于2023年,星期六数据库的并发操作导致的数据库不一致性主要有以下三种:丢失更新(LostUpdate)当两个事务T1和T2读入同一数据,并发执行修改操作时,T2把T1或T1把T2的修改结果覆盖掉,造成了数据的丢失更新问题,导致数据的不一致。61第六十一页,共一百零二页,编辑于2023年,星期六时间事务T1数据库中R值事务T2t01000t1READRt2READRt3R=R-100t4R=R-200t5UPDATERt6900UPDATERt7800丢失更新问题62第六十二页,共一百零二页,编辑于2023年,星期六污读(DirtyRead)事务T1更新了数据R,事务T2读取了更新后的数据R,事务T1由于某种原因被撤销,修改无效,数据R恢复原值。事务T2得到的数据与数据库的内容不一致,这种情况称为“污读”。

63第六十三页,共一百零二页,编辑于2023年,星期六时间事务T1数据库中R值事务T2t01000t1READRt2R=R-100t3UPDATERt4900READRt5ROLLBACKt61000污读问题64第六十四页,共一百零二页,编辑于2023年,星期六不可重复读(UnrepeatableRead)事务T1读取了数据R,事务T2读取并更新了数据R,当事务T1再读取数据R以进行核对时,得到的两次读取值不一致,这种情况称为“不可重复读”。

65第六十五页,共一百零二页,编辑于2023年,星期六时间事务T1数据库中R值事务T2t01000t1READRt2求和R+150READRt3R=R-200t4UPDATERt5800t6求和R+150不可重复读问题66第六十六页,共一百零二页,编辑于2023年,星期六产生上述三类数据不一致性的主要原因是并发操作破坏了事务的隔离性。并发控制就是要求DBMS提供并发控制功能以正确的方式管理并发事务,避免并发事务之间的相互干扰造成数据的不一致性,保证数据库的完整性。67第六十七页,共一百零二页,编辑于2023年,星期六5.3.4封锁实现并发控制的方法主要有两种:封锁(Lock)技术和时标(Timestamping)技术。通常会使用封锁技术。封锁类型(LockType)所谓封锁就是当一个事务在对某个数据对象(可以是数据项、记录、数据集以至整个数据库)进行操作之前,必须获得相应的锁,以保证数据操作的正确性和一致性。68第六十八页,共一百零二页,编辑于2023年,星期六基本的封锁类型有两种排它型封锁(ExclusiveLock)排它型封锁又称写封锁,简称为X封锁,它采用的原理是禁止并发操作。当事务T对某个数据对象R实现X封锁后,其他事务要等T解除了X封锁后,才能对R进行封锁。这就保证了其他事务在T释放R上的封锁之前,不能再对R进行操作。共享封锁(ShareLock)共享封锁又称读封锁,简称为S锁,它采用的原理是允许其他用户对同一数据对象进行查询,但不能对该数据对象进行修改。当事务T对某个数据对象R实现S封锁后,其他事务只能对R加S锁,而不能加X锁,直到T释放R上的S锁。这就保证了其他事务在T释放R上的S锁之前,只能读取R,而不能再对R作任何修改。69第六十九页,共一百零二页,编辑于2023年,星期六锁的相容矩阵

封锁协议(LockProtocol)

封锁可以保证合理地进行并发控制,保证数据的一致性。在封锁时,要考虑一定的封锁规则,例如,何时开始封锁、封锁多长时间、何时释放等,这些封锁规则称为封锁协议。70第七十页,共一百零二页,编辑于2023年,星期六上面讲述过的并发操作所带来的丢失更新、污读和不可重读等数据不一致性问题,可以通过三级封锁协议在不同程度上给予解决:一级封锁协议事务T在修改数据对象之前必须对其加X锁,直到事务结束。一级封锁协议只有修改数据时才进行加锁,如果只是读取数据则并不加锁,所以它不能防止“污读”和“不可重复读”。71第七十一页,共一百零二页,编辑于2023年,星期六时间事务T1数据库中R值事务T2t0XLOCKR1000t1READRt2XLOCKRt3R=R-100WAITt4UPDATERWAITt5UNLOCKR900WAITt6XLOCKRt7R=R-200t8UPDATERt9700UNLOCKR无丢失更新问题72第七十二页,共一百零二页,编辑于2023年,星期六二级封锁协议在一级封锁协议的基础上,另外加上事务T在读取数据R之前必须先对其加S锁,读完后释放S锁。二级封锁协议在读取数据之后,立即释放S锁,所以它仍然不能防止“重复读”数据。73第七十三页,共一百零二页,编辑于2023年,星期六时间事务T1数据库中R值事务T2t0XLOCKR1000t1READRt2R=R-100t3UPDATERt4900SLOCKRt5ROLLBACKWAITt6UNLOCKR1000SLOCKRt7READRt8UNLOCKR无污读问题74第七十四页,共一百零二页,编辑于2023年,星期六三级封锁协议在一级封锁协议的基础上,另外加上事务T在读取数据R之前必须先对其加S锁,读完后并不释放S锁,而直到事务T结束才释放。

75第七十五页,共一百零二页,编辑于2023年,星期六时间事务T1数据库中R值事务T2t01000t1SLOCKRt2READRt3XLOCKRt4COMMIT900WAITt5UNLOCKRWAITt61000XLOCKRt7READRt8R=R-200t9UPDATERt10UNLOCKR可重复读问题76第七十六页,共一百零二页,编辑于2023年,星期六封锁粒度(LockGranularity)封锁粒度指封锁的单位。根据对数据的不同处理,封锁的对象可以是这样一些逻辑单元:字段、记录、表、数据库等,封锁的数据对象的大小叫封锁粒度。封锁粒度越小,系统中能够被封锁的对象就越多,并发度越高,但封锁机构复杂,系统开销也就越大。封锁粒度越大,系统中能够被封锁的对象就越少,并发度越低,封锁机构越简单,相应系统开销也就越小。77第七十七页,共一百零二页,编辑于2023年,星期六死锁和活锁活锁(Livelock)

当某个事务请求对某一数据进行排它性封锁时,由于其他事务对该数据的操作而使这个事务处于永久等待状态,这种状态称为活锁。78第七十八页,共一百零二页,编辑于2023年,星期六时间事务T1事务T2事务T3事务T4t0LOCKRt1LOCKRt2WAITLOCKRt3UNLOCKRWAITWAITLOCKRt4WAITLOCKRWAITt5WAITWAITt6WAITUNLOCKRWAITt7WAITLOCKRt8WAIT活锁79第七十九页,共一百零二页,编辑于2023年,星期六死锁和活锁死锁(Deadlock)在同时处于等待状态的两个或多个事务中,其中的每一个在它能够进行之前,都等待着某个数据,而这个数据已被它们中的某个事务所封锁,这种状态称为死锁。死锁产生的条件:互斥条件:一个数据对象一次只能被一个事务所使用,即对数据的封锁采用排它式。不可抢占条件:一个数据对象只能被占有它的事务所释放,而不能被别的事务强行抢占。部分分配条件:一个事务已经封锁分给它的数据对象,但仍然要求封锁其他数据。循环等待条件:允许等待其他事务释放数据对象,系统处于加锁请求相互等待的状态。80第八十页,共一百零二页,编辑于2023年,星期六时间事务T1事务T2t0LOCKR1t1LOCKR2t2t3LOCKR2t4WAITt5WAITLOCKR1t6WAITWAITt7WAITWAIT死锁81第八十一页,共一百零二页,编辑于2023年,星期六数据RT1T2

事务依赖图

死锁的预防一次加锁法:一每个事物必须将所有要使用的数据对象全部依次加锁,并要求加锁成功,只要一个加锁不成功,表示本次加锁失败,则应该立即释放所有加锁成功的数据对象,然后重新开始加锁。顺序加锁法:是预先对所有可加锁的数据对象规定一个加锁顺序,每个事务都需要按此顺序加锁,在释放时,按逆序进行。死锁的诊断与解除如果在事务依赖图中沿着箭头方向存在一个循环,那么死锁的条件就形成了,系统就会出现死锁。选择一个处理死锁代价最小的事务,将其撤销以解除死锁。82第八十二页,共一百零二页,编辑于2023年,星期六并发调度的可串行性多个事务的并发执行是正确的,当且仅当其结果与按某一顺序的串行执行的结果相同,则我们称这种调度为可串行化的调度。可串行性是并发事务正确性的准则,按这个准则,一个给定的并发调度,当且仅当它是可串行化的时,才认为是正确的调度。83第八十三页,共一百零二页,编辑于2023年,星期六可串行化调度例:设有两个事务,分别包含下列操作:事务T1:读B;A=B+1;写回A事务T2:读A;B=A+1;写回B

设A、B的初值均为4,按T1T2顺序执行,结果:A=5,B=6;按T2T1顺序执行,结果:A=6,B=5。当并发调度时,如果执行的结果是这两者之一,则都是正确的结果。

84第八十四页,共一百零二页,编辑于2023年,星期六策略1:串行调度85第八十五页,共一百零二页,编辑于2023年,星期六策略2:并行调度不可串行化可串行化86第八十六页,共一百零二页,编辑于2023年,星期六5.4数据库的恢复系统必须具有检测故障并把数据从错误状态中恢复到某一正确状态的功能,这就是数据库的恢复。数据库恢复的基本原理就是利用存储在系统其他地方的冗余数据来修复。恢复系统应该提供两种类型的功能:生成冗余数据对可能发生的故障作某些准备冗余重建利用这些冗余数据恢复数据库登记日志文件数据转储87第八十七页,共一百零二页,编辑于2023年,星期六登记日志文件日志文件是用来记录事务对数据库的更新操作的文件。典型的日志文件主要包含以下内容:(1)更新数据库的事务标识(标明是哪个事务);(2)操作的类型(插入、删除或修改);(3)操作对象;(4)更新前数据的旧值(对于插入操作,没有旧值);(5)更新后数据的新值(对于删除操作,没有新值);(6)事务处理中的各个关键时刻(事务的开始、结束及其真正写回的时间)。先写原则:(1)至少要等到相应运行记录的撤销部分已经写入日志文件中以后,才允许该事务向物理数据库中写入记录。(2)直到事务的所有运行记录的撤销和重做两部分都已写入日志文件中以后,才允许事务完成提交处理。88第八十八页,共一百零二页,编辑于2023年,星期六为保证数据库是可恢复的,登记日志文件时要求:登记的次序严格按并行事务执行的时间次序必须先写日志文件,后写数据库写日志文件操作:把表示这个修改的日志记录写到日志文件写数据库操作:把对数据的修改写到数据库中89第八十九页,共一百零二页,编辑于2023年,星期六登记日志文件的原则(续)为什么要先写日志文件写数据库和写日志文件是两个不同的操作在这两个操作之间可能发生故障如果先写了数据库修改,而在日志文件中没有登记下这个修改,则以后就无法恢复这个修改了如果先写日志,但没有修改数据库,按日志文件恢复时只不过是多执行一次不必要的UNDO操作,并不会影响数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论