第14课 事务与锁机制 1.什么是事务?事务有何特性? 答:
SQL Server中的一个事务(Transaction)是由一系列的数据库查询操作和更新操作构成的,把这一系列操作作为单个逻辑工作单元执行。
事务具有4个特性,即原子性、一致性、隔离性和持久性。
(1)原子性:一个事务中的所有操作是一个逻辑上不可分割的单位。 (2)一致性:事务在完成时,必须使所有的数据都保持一致状态。 (3)隔离性:一个事务的执行不能被另一个事务干扰。
(4)持久性:指一个事务一旦提交,则它对数据库中数据的改变就应该是永久的。 2.SQL Server采用哪些机制保证事务物理的完整性? 答:
SQL Server提供以下机制,保证每个事务物理的完整性。 1)锁机制。锁定设备,使事务相互隔离。
2)事务日志。即使服务器硬件、操作系统或 SQL Server 自身出现故障,SQL Server 也可以在重新启动时使用事务日志,将所有未完成的事务自动地回滚到系统出现故障的位置。
3)事务管理。强制保持事务的原子性和一致性。事务启动之后,就必须成功完成,否则 SQL Server 将撤消该事务启动之后对数据所作的所有修改。
3.SQL Server的事务模式有几种?每一种模式有何特点? 答:
SQL Server的事务模式可以分为显式事务、隐性事务与自动提交事务3种模式。
显式事务的特点:显式事务可以显式地在其中定义事务的启动和结束。显式事务也称为用户定义或用户指定的事务。定义显式事务的语句有BEGIN TRANSACTION、COMMIT TRANSACTION、COMMIT WORK、ROLLBACK TRANSACTION 或 ROLLBACK WORK。
隐性事务模式的特点:当连接以隐性事务模式进行操作时, SQL Server将在提交或回滚当前事务后自动启动新事务。无须描述事务的开始,只需提交或回滚每个事务。隐性事务模式生成连续的事务链。
自动提交事务模式的特点:这是SQL Server 默认的事务管理模式,每条单独的语句都是一个事务。也就是说,每个Transact-SQL语句结束时,事务被自动提交,若遇到错误就会回滚。只要自动提交模式没有被显式或隐性事务替代,SQL Server 连接就以该默认模式进行操作。 4.事务的提交和撤销有何意义? 答:
使用COMMIT语句可以提交事务。如果没有遇到错误,可使用该语句成功地结束事务。事务一旦提交,该事务中的所有数据修改在数据库中都将永久有效。事务占用的资源将被释放。
使用ROLLBACK语句可以撤销事务。用来清除遇到错误的事务。一旦撤销事务,该事务修改的所有数据都返回到事务开始时的状态。事务占用的资源将被释放。
5.不当的并发控制将会引起何种数据不一致性?请举例说明。
答:
不当的并发控制将会引起以下四种数据不一致性: 1.丢失更新
当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。每个事务都不知道其他事务的存在。最后的更新将重写由其他事务所做的更新,这将导致数据丢失。
例如,两个编辑人员制作了同一文档的电子副本。每个编辑人员独立地更改其副本,然后保存更改后的副本,这样就覆盖了原始文档。最后保存其更改副本的编辑人员覆盖了第一个编辑人员所做的更改。如果在第一个编辑人员完成之后第二个编辑人员才能进行更改,则可以避免该问题。 2.脏读
未确认的相关性也称脏读,当第二个事务选择其他事务正在更新的行时,会发生未确认的相关性问题。第二个事务正在读取的数据还没有确认并且可能由更新此行的事务所更改。
例如,一个编辑人员正在更改电子文档。在更改过程中,另一个编辑人员复制了该文档(该副本包含目前为止所做的全部更改)并将其分发给预期的用户。此后,第一个编辑人员认为目前所做的更改是错误的,于是删除了所做的编辑并保存了文档。分发给用户的文档包含不再存在的编辑内容,并且这些编辑内容应认为从未存在过。如果在第一个编辑人员确定最终更改前任何人都不能读取更改的文档,则可以避免该问题。 3.不可重复读
当第二个事务多次访问同一行而且每次读取不同的数据时,会发生不一致的分析问题。不一致的分析与未确认的相关性类似,因为其他事务也是正在更改第二个事务正在读取的数据。然而,在不一致的分析中,第二个事务读取的数据是由已进行了更改的事务提交的。而且,不一致的分析涉及多次(两次或更多)读取同一行,而且每次信息都由其他事务更改,因而该行被非重复读取。
例如,一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。如果只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题。 4.幻象读
当对某行执行插入或删除操作,而该行属于某个事务正在读取的行的范围时,会发生幻象读问题。事务第一次读的行范围显示出其中一行已不复存在于第二次读或生续读中,因为该行已被其他事务删除。同样,由于其他事务的插入操作,事务的第二次或后续读显示有一行已不存在于原始读中。
例如,一个编辑人员更改作者提交的文档,但当生产部门将其更改内容合并到该文档的主副本时,发现作者已将未编辑的新材料添加到该文档中。如果在编辑人员和生产部门完成对原始文档的处理之前,任何人都不能将新材料添加到文档中,则可以避免该问题。 6.什么是共享锁?什么是排它锁? 答:
共享(S)锁允许并发事务读取(SELECT)一个资源。资源上存在共享(S)锁时,任何其他事务都不能修改数据。 排他(X)锁又称互斥锁,可以防止并发事务对资源进行访问。其他事务不能读取或修改排他(X)锁锁定的数据。 7.什么是死锁?如何解除死锁? 答:
死锁是一种可能发生在任何多线程系统中的状态。当某组资源的两个或多个线程之间有循环相关性时,将发生死锁。 在 SQL Server 2000 中,由一个称为锁监视器线程的单独的线程执行死锁检测。它识别线程正在等待的资源。然后,锁监视器查找特定资源的拥有者,并递归地继续执行对那些线程的死锁搜索,直到找到一个循环。用这种方式识别的循环形成一个死锁。
在识别死锁后,SQL Server 通过自动选择可以打破死锁的线程(死锁牺牲品)来结束死锁。 8.锁的状态有几种?分别起什么作用? 答:
SQL Server使用六种不同的锁模式来锁定资源。
1. 共享锁
共享(S)锁允许并发事务读取(SELECT)一个资源。 2.更新锁
更新(U)锁可以防止通常形式的死锁。 3.排他锁
排他(X)锁又称互斥锁,可以防止并发事务对资源进行访问。 4.意向锁
意向锁表示SQL Server需要在层次结构中的某些底层资源上获取共享(S)锁或排他(X)锁。 5.架构锁
用于保护数据库的模式,又称模式锁。 6.大容量更新锁
当将数据大容量复制到表,且指定了TABLOCK提示或者使用sp_tableoption设置了table lock on bulk表选项时,将使用大容量更新(BU)锁。
9.按照题目要求在查询分析器中输入SQL命令,并进行调试:
1)定义一个事务向选课表输入新的数据记录,如果所输入的学号在学生基本信息表中没有,则回滚撤销,否则提交完成。 答: 代码如下: BEGIN TRANSACTION INSERT 选课
VALUES(‘071071001’,’0307’,’80’,’’,’3’)
IF EXISTS(SELECT * FROM 学生基本信息 WHERE 学号=‘071071001’) COMMIT TRANSACTION ELSE
ROLLBACK TRANSACTION
2)修改选课表中的数据,将课程号为“0310”的成绩乘以1.3,为避免脏读,请为选课表加排它锁,直到事务结束。 提示:在更新语句中,加锁的短语为:WITH (锁的类型)。 答:
UPDATE 选课 WITH(TABLOCK HOLDLOCK) SET 成绩=成绩*1.3 WHERE 课程号='0310'
3)使用sp_lock显示SQL Server中当前所有锁的信息。 答:
USE master; GO
EXEC sp_lock; GO
第15课 学生信息管理系统数据的备份与还原 1.在什么样的情况下需要进行数据库的备份和还原? 答:
在使用过程中,难免会出现各种形式的故障,如硬件故障、软件错误、病毒、误操作或恶意的破坏等,而这些故障会造成系统运行的异常中断,甚至会破坏数据库,使数据库中的数据部分或全部丢失。为了保证在各种故障发生后,数据库中的数据可以从错误状态还原到某一正确的状态,数据库系统应具有数据库备份和还原功能。应根据实际需要对进行数据库的备份和还原。
2.需要对SQL Sserver的系统数据库作备份吗? 答:
系统数据库记录了重要的系统信息,它们是确保SQLServer系统正常运行的重要依据。如master数据库记录 SQL Server 系统的所有系统级别信息,记录所有的登录账户和系统配置设置。model 数据库则提供了创建用户数据库的模板信息。msdb 数据库记录了有关SQL Server的Agent服务的全部信息。因此,这些系统数据库要做备份。 3.SQL Server提供了哪些数据备份的类型?这些备份类型适合于什么样的数据库? 答:
SQL Server提供以下四种类型的数据库备份方式。 1)完全备份
完全备份是将数据库中的所有数据文件全部复制。将所有的用户数据、数据库对象和事务日志复制在一个文件里。当系统出现故障时,可以恢复到最近一次数据库完全备份时的状态。 2) 差异备份
差异备份仅复制自上一次完全数据库备份之后发生更改的数据。差异备份比完全备份工作量小而且备份速度快。因此,对于经常修改的数据库,采用差异备份策略,可以减少备份和还原的时间。 3) 事务日志备份
事务日志备份是指对数据库发生的事务进行备份。包括从上次进行事务日志备份、差异备份和数据库完全备份之后,所有已经完成的事务。使用事务日志备份可将数据库恢复到特定的即时点(如输入多余数据前的那一点)或恢复到故障点。
4) 文件或文件组备份
文件或文件组备份是指对数据库文件或数据库文件组进行备份。这是一种相对较完善的备份。当可用的备份时间不足以支持完全数据库备份时,则可以使用文件或文件组备份模式,在不同的时间备份数据库的子集。 4.什么是备份设备?如何创建这些备份设备? 答:
备份设备是指用来存储备份内容的存储介质,可以是磁盘、磁带或命名管道。 创建备份设备有以下两种方法: 1)使用企业管理器创建备份设备
下面以为STUMS数据库在D盘的根目录下创建STU_BF备份设备为例,说明使用企业管理器创建备份设备的操作过程。 (1)展开服务器组,然后展开服务器;
(2)展开“管理”文件夹,右击“备份”图标,在弹出的快捷菜单中选择“新建备份设备”命令,打开备份设备属性对话框;
(3)在“名称”栏中输入备份设备的名称(STU_BF);
(4)选中“文件名”单选钮,单击浏览(“...”)按钮,选择备份设备的存储位置(D:\\),并输入文件名(STUMS.BAK),定义完毕,如图15-3-1所示;
(5)单击“确定”按钮,创建备份设备。 2)使用系统存储过程创建备份设备
可以在查询分析器中使用sp_addumpdevice系统存储过程创建备份设备。其基本语法如下:
sp_addumpdevice [ @devtype = ] 'device_type' , [ @logicalname = ] 'logical_name' , @physicalname = ] 'physical_name' 其中,
[@devtype =] 'device_type':备份设备的类型,device_type 的数据类型为 varchar(20),没有默认设置,可以是disk(硬盘)、pipe(命名管道)、tape(磁带)三者之一。
[@logicalname =] 'logical_name':备份设备的逻辑名称,该逻辑名称用于 BACKUP 和 RESTORE 语句中。 [@physicalname =] 'physical_name':备份设备的物理名称。物理名称必须遵照操作系统文件名称的规则或者网络设备的通用命名规则,并且必须包括完整的路径。 5.还原数据库的意思是什么? 答:
数据库还原是指将数据库的备份加载到服务器中的过程,把数据库从错误状态还原到某一正确状态。 6.当还原数据库时,用户可以使用这些正在还原的数据库吗? 答:
当还原数据库时,用户不可以使用这些正在还原的数据库。 7.SQL Sserver中数据库三种还原方法有什么区别? 答: 1)简单还原
简单还原就是指在进行数据库还原时,仅使用了数据库备份或差异备份,而不涉及事务日志备份,只能将数据库恢复到上次备份的即时点。 2)完全还原
完全还原是指通过使用数据库完全备份、差异备份、文件组备份和事务日志备份,将数据库还原到发生失败的时刻,因此几乎不造成任何数据丢失。?????? 3)大容量日志记录还原
大容量日志记录还原在性能上要优于简单还原和完全还原模式。大容量日志记录还原模式可以使用数据库完全备份、差异备份、文件组备份和事务日志备份,提供对数据库的完全防范,并对某些大规模或大容量复制操作提供最佳性能和最少的日志空间。 第16课 程序设计基础 1.何为批处理?简述其作用。 答:
批处理是包含一个或多个 Transact-SQL 语句的组,从应用程序一次性地发送到SQL Server 执行。SQL Server 将批处理语句编译成一个可执行单元。建立批处理时,用 GO 命令来标识批处理的结束。 2.试述变量的分类。 答:
SQL Server 2000中的变量分为局部变量和全局变量两种,其中全局变量的名称以两个@@字符开始,由系统定义和维护;局部变量名称以一个@字符开始,由用户自己定义和赋值。 3.局部变量是如何定义和赋值的。 答:
在使用一个局部变量之前,必须先用DECLARE语句声明这个变量。DECLARE语句的语法格式为: DLCLARE @变量名 变量类型[,@变量名 变量类型?] 变量名必须以 @ 开头,局部变量名必须符合标识符规则。
第一次声明变量时,将此变量的值设为 NULL。若要为变量赋值,可使用 SET 语句。也可以通过 SELECT 语句的选择
列表中当前所引用值为变量赋值。语法如下: SET @变量名=变量值 SELECT @变量名=变量值
4.试述SQL Server中提供的主要流程控制语句及其功能。 答:
1.BEGIN?END
BEGIN?END用来定义一个语句块,位于BEGIN?END之间的SQL语句都属于这个语句块,可视作一个单元执行。 2.IF?ELSE
在SQL Server中,为了控制程序的执行方向,引进了IF?ELSE条件判断结构。 3.CASE结构
CASE结构提供了较一般IF?ELSE结构更多的条件选择,且判断功能更方便、更清晰明了。CASE结构用于多条件分支选择,可完成计算多个条件并为每个条件返回单个值。 4.WHILE语句
WHILE语句通过逻辑表达式设置重复执行 SQL 语句或语句块的循环条件。只要指定的条件为真,就重复执行语句。可以使用 BREAK 和 CONTINUE 关键字在循环内部控制 WHILE 循环中语句的执行。 5.简述WAITFOR语句的作用。 答:
WAITFOR语句指定触发语句块、存储过程或事务执行的时间、时间间隔或事件。 6.编写程序求2~500之间的所有素数。 答:
declare @i int,@flag int ,@s int set @s=2 while @s<500 begin set @i=2 set @flag=0 while @i<@s/2 begin
if @s%@i=0 set @flag=1 set @i=@i+1 end
if @flag=0 print @s set @s=@s+1 end