第十一章SQL程序设计 ☆程序中的事务 事务是最小的工作单元。这个工作单元要么成功完成所有操作, 要么就是失败,并将所做的一切复原。 概述 事务可以用于确保数据能够正确地被修改,避免造成数据只修改 部分而导致数据不完整,或是在修改途中受到其他用户的干扰。事 务有4个特性。: 原子性( Atomic)事务是原子的,要么完成整个操作,要么退出所有操作 。如果任何语句失败,则所有作为事务一部分的语句都不会运行。 致性( Con Demoltent)在事务完成或失败时,要求数据库处于一致状态。 由事务引发的从一种状态到另一种状态的变化是一致的。 独立性( Isolated)事务是独立的。它不与数据库的其他事务交互或冲突。 持久性( Durable)称事务是持久的,是因为在事务完成后它无须考虑和数 据库发生的任何事情。如果系统掉电且数据库服务器崩溃,事务保证在服务 器重启后仍是完整的
第十一章 SQL程序设计 ❖ 程序中的事务 事务是最小的工作单元。这个工作单元要么成功完成所有操作, 要么就是失败,并将所做的一切复原。 1 、概述 事务可以用于确保数据能够正确地被修改,避免造成数据只修改 一部分而导致数据不完整,或是在修改途中受到其他用户的干扰。事 务有4个特性。: 原子性(Atomic)事务是原子的,要么完成整个操作,要么退出所有操作 。如果任何语句失败,则所有作为事务一部分的语句都不会运行。 一致性(ConDemoltent)在事务完成或失败时,要求数据库处于一致状态。 由事务引发的从一种状态到另一种状态的变化是一致的。 独立性(Isolated)事务是独立的。它不与数据库的其他事务交互或冲突。 持久性(Durable)称事务是持久的,是因为在事务完成后它无须考虑和数 据库发生的任何事情。如果系统掉电且数据库服务器崩溃,事务保证在服务 器重启后仍是完整的
第十一章SQL程序设计 ☆程序中的事务的类型 1)显式事务 显示事务是手工配置的事务。用保留字标识显式事务的开始和结束 保留字包括 BEGIN TRANSACTION、 COMMIT TRANSACTION、 ROLLBACK TRANSACTION和 SAVE TRANSACTION,其中 TRANSACTIO0小N可以简写为TRAN 要开始显式事务,首先输入关键词 BEGIN TRAN。 要结束显示事务,使用 COMMIT TRAN。 如果要取消事务,使用 ROLL BACK TRAN命令, ROLLBACK TRAN将完全 取消事务,或将事务恢复到初始状态。 可以使用 SAVE TRAN命令生成存储点,然后有选择性地恢复到那些 点。事务内部存储点的数目没有明确的约束,而且可以在一个事务中 出现重复的存储点名字。然而,只有最后那个存储点名字会被用于复 原到指定点
第十一章 SQL程序设计 ❖ 程序中的事务的类型 1)显式事务 显示事务是手工配置的事务。用保留字标识显式事务的开始和结束 。保留字包括 BEGIN TRANSACTION、COMMIT TRANSACTION、ROLLBACK TRANSACTION和SAVE TRANSACTION,其中TRANSACTION可以简写为TRAN 。 要开始显式事务,首先输入关键词BEGIN TRAN。 要结束显示事务,使用COMMIT TRAN。 如果要取消事务,使用ROLL BACK TRAN命令,ROLLBACK TRAN将完全 取消事务,或将事务恢复到初始状态。 可以使用SAVE TRAN命令生成存储点,然后有选择性地恢复到那些 点。事务内部存储点的数目没有明确的约束,而且可以在一个事务中 出现重复的存储点名字。然而,只有最后那个存储点名字会被用于复 原到指定点
第十一章SQL程序设计 ☆程序中的事务的类型 2)隐式事务 有时候看起来没有使用事务,但它们可能隐藏在幕后,这种事务叫 做隐式事务。 要使用这种模式,必须使用 Set Implicit Transactions0n语句 来设置连接。 SQLServer的任何数据修改语句,都是隐式事务。下列的 任何一条语句都可以作为一个隐式事务的开始: ALTER TABLE、 CREATE DELETE、DROP、 FETCH、 GRANT、 INSERT、OPEN、 REVOKE、 SELECT TRUNCATE TABLE、 UPDATE。 要结束隐式事务,必须使用 COMMIT TRANSACTION或 ROLLBACK TRANSACTI0N语句。之后,任何指令的命令都将会开始另一个事务
第十一章 SQL程序设计 ❖ 程序中的事务的类型 2)隐式事务 有时候看起来没有使用事务,但它们可能隐藏在幕后,这种事务叫 做隐式事务。 要使用这种模式,必须使用Set Implicit_Transactions On语句 来设置连接。SQLServer的任何数据修改语句,都是隐式事务。下列的 任何一条语句都可以作为一个隐式事务的开始:ALTER TABLE、CREATE 、 DELETE、DROP、FETCH、GRANT、INSERT、OPEN、REVOKE、SELECT 、TRUNCATE TABLE、UPDATE。 要结束隐式事务,必须使用COMMIT TRANSACTION或ROLLBACK TRANSACTION语句。之后,任何指令的命令都将会开始另一个事务
第十一章SQL程序设计 ☆程序中的事务的工作机制 例: BEGIN TRAN INSERT INT0课程(课程号,课程名,备注) VALUES(0001,大学语文,’) UPDATE教学计划SET启始周=2WER专业代码=0101 DELETE教师WERE姓名 IS NULL COMMIT TRAN 1)当 BEGIN TRAN语句到达数据库时, SQL Server分析出这是显式事务的开始, SQL Server找到下一个可用的内存日志页面,并给新事务分配一个事务ID 2)接着运行 INSERT语句,新的行被记录到事务日志中,数据页面在内存中进 行修改,如果所需页面不在内存中,则从磁盘调出。 3)下一个语句以相似方式运行。 UPDATE语句记录在事务日志中,数据页在内 存中进行了修改。 4)当 SQL Server收到 COMMITTRAN时,日志页面被写到数据库的日志设备上 这样才能保证日志可以被恢复。由于日志变化写入了硬盘,它保证事务是可快 复的,即使掉电了或在数据页写入磁盘时数据库崩溃了,也能进行事务 恢复
第十一章 SQL程序设计 ❖ 程序中的事务的工作机制 例:BEGIN TRAN INSERT INTO 课程 (课程号,课程名,备注) VALUES('0001','大学语文','') UPDATE 教学计划 SET 启始周=2 WHERE 专业代码='0101' DELETE 教师 WHERE 姓名 IS NULL COMMIT TRAN 1)当BEGIN TRAN语句到达数据库时,SQL Server分析出这是显式事务的开始, SQL Server找到下一个可用的内存日志页面,并给新事务分配一个事务ID。 2)接着运行INSERT语句,新的行被记录到事务日志中,数据页面在内存中进 行修改,如果所需页面不在内存中,则从磁盘调出。 3)下一个语句以相似方式运行。UPDATE语句记录在事务日志中,数据页在内 存中进行了修改。 4)当SQL Server收到COMMITTRAN时,日志页面被写到数据库的日志设备上, 这样才能保证日志可以被恢复。由于日志变化写入了硬盘,它保证事务是可恢 复的,即使掉电了或在数据页写入磁盘时数据库崩溃了,也能进行事务 恢复
第十一章SQL程序设计 ☆程序中的检查点的处理 SQL Serverl中有二类检查点:自动检查点和手工检查点 自动检查点是基于 SQL Server计算的。可在 RECOVERY INTERVAL配 置选项中规定检查点处理的频率。该选项指出以分钟为单位的用来恢 复系统中数据库的最大时间间隔。如果 SQL Server认为恢复数据库要 大量时间,它将发出自动检查点。这时,所有修改过的内存中的数据 页面将写入磁盘(包括日志页面),自动检查点每60秒检查一次,并 在各数据库之间循环,以决定该数据库是否需要赋予检查点。注意, 对带有“ trunc. log on Chkpt.”选项设置的数据库,该过程将从日志 中截断已提交的事务 手工检查点可在任何时候输入 Transact-S哑L命令 CHECKPOIN来强 制执行。注意,只有SA或数据库的DBA才能执行该命令。发出手检查 点指令后,内存中所有修改过的页面记入磁盘,就象自动检查点处理 时所发生的情况一样。注意,手工检查点对事务日志无效(即不将它 入磁盘),不考虑是否设置了“ trunk. log on Chkpt,数据库选项
第十一章 SQL程序设计 ❖ 程序中的检查点的处理 SQL Server中有二类检查点:自动检查点和手工检查点。 自动检查点是基于SQL Server计算的。可在RECOVERY INTERVAL配 置选项中规定检查点处理的频率。该选项指出以分钟为单位的用来恢 复系统中数据库的最大时间间隔。如果SQL Server认为恢复数据库要 大量时间,它将发出自动检查点。这时,所有修改过的内存中的数据 页面将写入磁盘(包括日志页面),自动检查点每60秒检查一次,并 在各数据库之间循环,以决定该数据库是否需要赋予检查点。注意, 对带有“trunc.log on Chkpt.”选项设置的数据库,该过程将从日志 中截断已提交的事务。 手工检查点可在任何时候输入Transact-SQL命令CHECKPOINT来强 制执行。注意,只有SA或数据库的DBA才能执行该命令。发出手工检查 点指令后,内存中所有修改过的页面记入磁盘,就象自动检查点处理 时所发生的情况一样。注意,手工检查点对事务日志无效(即不将它 写入磁盘),不考虑是否设置了“trunk.log on Chkpt.”数据库选项