390 likes | 502 Views
事务处理. 数据库操作异常. 故障现象 由于一项处理可能同时操作几个表,同时可能存在各种因素,处理的结果有几种可能性:全部完成(最好的),或者全部不作(可重新再作一遍),一部分成功,而另一部分失败(最坏的)。 例如: 从 A 客户转帐 100 元到 B 客户的帐户中,则处理包括: A 客户帐户减少 100 元, B 帐户增加 100 元。若减少与增加两个操作皆成功则最好;若两者都不成功则可以再处理一遍;若只成功了减少而增加失败,则会出现资金异常。 措施
E N D
数据库操作异常 • 故障现象 由于一项处理可能同时操作几个表,同时可能存在各种因素,处理的结果有几种可能性:全部完成(最好的),或者全部不作(可重新再作一遍),一部分成功,而另一部分失败(最坏的)。 例如: 从A客户转帐100元到B客户的帐户中,则处理包括:A客户帐户减少100元,B帐户增加100元。若减少与增加两个操作皆成功则最好;若两者都不成功则可以再处理一遍;若只成功了减少而增加失败,则会出现资金异常。 • 措施 为了满足数据的一致性,要求这几个操作必须全部完成,或全部不作,对于后一种情况是无法接受的,故必须有一种机制来避免后一种情况的出现。
事务 • 事务的概念 事务(Transaction):为用户定义的有限的数据库操作序列。可以为:一条SQL语句;一组SQL语句序列;一个包含对DB操作的应用程序; 事务组成=事务开始+操作集+事务结束 BEGIN TRANSACTION ……SQL语句 END TRANSACTION/COMMIT/ROLLBACK 其中:COMMIT提交,事务对DB的修改写回到磁盘上的DB中去。ROLLBACK:回滚,撤消对DB之修改,恢复到事务开始状态。 事务是数据库运行中的一个逻辑工作单位,由DBMS中的事务管理子系统负责事务处理。在中大型的数据库中具有事务机制,在小型的个人数据库中,如:ACCESS,PARADOX,FOXBASE等都不具备事务处理,事务成为数据库性能的一种衡量。
事务的ACID性质 • 事务的特性 包括事务的原子性、数据的一致性 、事务之间的隔离性以及事务的持久性 。四者统称事务的ACID特性。 • 事务的原子性(Atomicity) • 定义 事务是一个不可分割的工作单元,其对DB的操作要么都做,要么都不做。 • 目标 保证DB数据的一致性(转帐问题)。 • 技术 日志 + ROLLBACK(UNDO)(意外终止); 并发控制(交叉执行); 实现 由DBMS自动完成。
事务的ACID性质 • 数据的一致性 • 定义 事务的执行必须是将DB从一个正确(一致)状态转换到另一个正确(一致)状态。 如:转帐问题中,A有100万人民币是一个正确状态,减去50万,转到B帐上50万,DB从一个正确状态转变另一个正确状态,这两个操作,若只做其中一个,则不能实现DB从一个正确状态转到另一个正确状态,破坏了事务一致性。 • 目标 保证DB数据一致性(丢失更新、读脏、读不可重复)。 • 技术 并发控制。 • 实现 用户定义事务(保证相关操作在一个事务中);DBMS自动维护之。
事务的ACID性质 • 事务之间的隔离性 • 定义 —个事务中对DB的操作及使用的数据与其它并发事务无关,并发执行的事务间不能互相干扰。 • 目标 防止链式夭折。 • 技术 并发控制。 • 实现 DBMS自动实现。
事务的ACID性质 • 事务的持久性 • 定义 —个已提交事务对DB的更新是永久性的,不受后来故障的影响。 • 目标 保证DB可靠性 。 • 技术 备份+日志。 • 实现 DBMS恢复子系统自动实现。
SQL Server7.0事务的处理过程 • 图示
事务的操作 要使用事务处理数据库操作,必须将一些SQL语句定义在一个事务当中。事务的操作具体包括以下几种: • 开始事务 格式:Begin Transaction [Transaction_name] 说明:开始事务,当执行了该语句,则其后出现的SQL语句,为此事务的内部操作。 • 提交事务 格式:COMMIT Transaction [Transaction_name] 说明:提交一事务,表示一个事务的正常结束。该语句执行后,DBMS将该事务的所有对数据库的操作保存到数据库当中。 • 回滚事务 格式:RollBack Transaction [Transaction_name] 说明:回滚一事务,表示一个事务的非正常结束。该语句执行后,DBMS将该事务的所有对数据库的操作撤销,使数据库恢复到事务执行前的一致状态。
举例 SQL脚本程序: BEGIN Transaction SELECT @@trancount //显示当前活动事务数 SELECT * FROM stores WHERE stor_id = '7066' UPDATE stores SET stor_name = 数据库‘ WHERE stor_id = '7066' SELECT * FROM stores WHERE stor_id = '7066' SELECT @@trancount /*Commit transaction SELECT * FROM stores WHERE stor_id = '7066' 问题: 1.若没有执行Commit,上修改语句写到物理数据库了吗?如何确定这一点?当前有多少事务? 2.其他事务能够查询或更新被修改的数据吗? 3.若输入RollBack语句并执行,数据库中的数据如何?当前有多少事务数? 4.输入Commit语句并执行,数据库中的数据如何?当前有多少事务数?
存储过程 • 存储过程概念 SQL Server提供了一种方法,它可以将一些固定的操作集中起来由SQL Server数据库服务器来完成,以实现某个任务,这种方法就是存储过程。 存储过程是保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合。类似于程序语言的过程。
存储过程特点 • 存储过程特点 • 接受输入参数并以输出参数的形式将多个值返回至调用过程或批处理。 • 包含执行数据库操作(包括调用其它存储过程)的编程语句 。 • 向调用过程或批处理返回状态值,以表明成功或失败(以及失败原因)。 • 可使用Transact-SQL EXECUTE 语句运行存储过程。存储过程与函数不同,因为存储过程不返回取代其名称的值,也不能直接用在表达式中。
存储过程的优点 • 存储过程的优点 • 允许模块化程序设计。 • 可以在单个存储过程中执行一系列 SQL 语句。 包括:语句快、结构控制命令、变量、常量、运算符、表达式等。 • 存储过程在创建时即在服务器上进行编译,所以执行起来比单个 SQL 语句快。 • 减少网络流量 。
存储过程的分类 • 存储过程的分类 主要分为:系统存储过程、用户存储过程、临时存储过程、扩展存储过程、远程存储过程。 • 系统存储过程 由系统提供的存储过程,可以作为命令直接执行。系统存储过程主要存储与master数据库中,其前缀为sp_。 • 用户存储过程 用户在特定数据库中,根据应用创建的存储过程。 • 临时存储过程 只能在一个用户会话中使用的存储过程,当会话结束时,临时存储过程自动消失。创建时在在名称上加上“#”标识符,即可创建临时存储过程。
存储过程的分类 • 扩展存储过程 是在SQL SERVER环境外执行的动态连接库DLL。 • 远程存储过程 在远程的主机上执行的存储过程。
存储过程的创建 • 方法 • 使用“创建存储器向导” • 使用Transact-SQL语句 • 使用企业管理器 • 存储过程的三个组成部分 创建存储过程时,需要确定存储过程的三个组成部分: • 所有的输入参数以及传给调用者的输出参数 • 被执行的针对数据库的操作语句,包括调用其它存储过程的语句,即过程体。 • 返回给调用者的状态值,以指明调用是成功还是失败。
使用向导创建存储过程 • 使用向导创建存储过程 在企业管理器中,选择工具菜单中的向导选项,选择“创建存储过程向导”(如图3-1所示),则出现欢迎使用创建存储过程向导对话框,如图5-71所示。根据图5-71--图5-76提示可完成创建存储过程。
使用向导创建存储过程 欢迎使用创建存储过程向导对话框
使用向导创建存储过程 选择数据库对话框
使用向导创建存储过程 选择数据库对象对话框
使用向导创建存储过程 完成创建存储过程向导对话框
使用向导创建存储过程 编辑存储过程属性对话框
使用向导创建存储过程 编辑存储过程SQL对话框
使用企业管理器创建存储过程 • 使用企业管理器创建存储过程 • 步骤 • 单击右键选择指定的数据库,在弹出的快捷菜单中选择“新建存储过”选项。 • 在文本框中可以输入创建存储过程的T_SQL语句。 单击“检查语法”,则可以检查语法是否正确;单击“确定”按钮,即可保存该存储过程。如果要设置权限,单击“权限…”按钮。
使用企业管理器创建存储过程 新建存储过程对话框
使用企业管理器创建存储过程 设置权限对话框
使用CREATE PROCEDURE命令创建存储过程 • 语法形式如下: CREATEPROC[EDURE]procedure_name[;number] [{@parameter data_type} [VARYING][=default][OUTPUT]][,...n] WITH {RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}] [FORREPLICATION] AS sql_statement [ ...n ] 说明: • procedure_name:用于指定要创建的存储过程的名称 • number:该参数是可选的整数,它用来对同名的存储过程分组,以便用一条 DROP PROCEDURE 语句即可将同组的过程一起除去。
CREATE PROCEDURE命令 • @parameter:过程中的参数。在 CREATE PROCEDURE 语句中可以声明一个或多个参数。 • data_type:用于指定参数的数据类型。 • VARYING:用于指定作为输出OUTPUT参数支持的结果集。 • Default:用于指定参数的默认值。 • OUTPUT:表明该参数是一个返回参数。 • RECOMPILE:表明 SQL Server 不会保存该存储过程的执行计划 。 • ENCRYPTION :表示 SQL Server 加密了 syscomments 表,该表的text字段是包含 CREATE PROCEDURE 语句的存储过程文本。 • FOR REPLICATION:用于指定不能在订阅服务器上执行为复制创建的存储过程。 • AS:用于指定该存储过程要执行的操作。 • sql_statement:是存储过程中要包含的任意数目和类型的 Transact-SQL 语句。
CREATE PROCEDURE命令 CREATE PROCEDURE 存储过程名 [ @parameter data_type ] //输入参 数 AS 语句体
举例1 • 创建使用参数的存储过程 • 创建一个在 pubs 数据库中很有用的存储过程。给出一个作者的姓和名,该存储过程将显示该作者的每本书的标题和出版商。 CREATE PROC au_info @lastname varchar(40), @firstname varchar(20) AS SELECT au_lname, au_fname, title, pub_name FROM authors INNER JOIN titleauthor ON authors.au_id = titleauthor.au_id JOIN titles ON titleauthor.title_id = titles.title_id JOIN publishers ON titles.pub_id = publishers.pub_id WHERE au_fname = @firstname AND au_lname = @lastname
举例2 • 创建使用参数默认值的存储过程 • 显示给出的出版商所出版的书的情况,包括:作者姓名及出版名称。如果未提供出版商的名称,该存储过程将显示“ Algodata Infosystems ”出版商的信息。 CREATE PROC pub_info2 @pubname varchar(40) = 'Algodata Infosystems' AS SELECT au_lname, au_fname, pub_name FROM authors INNER JOIN titleauthor ON authors.au_id = titleauthor .au_id JOIN titles ON titleauthor .title_id = titles .title_id JOIN publishers ON titles .pub_id = publishers .pub_id WHERE @pubname = p.pub_name
举例3 • 删除authors表中的某个作者 CREATE PROCEDURE delete_authors_1 @au_id_1 varchar(10) AS DELETE authors WHERE au_id = @au_id_1
重命名存储过程 • 重命名存储过程 • 修改存储过程的名称可以使用系统存储过程sp_rename,其语法形式如下: sp_rename 原存储过程名称,新存储过程名称 例如: 将名为delete_authors_1的存储过程改为delete_authors sp_rename delete_authors_1 , delete_authors • 通过企业管理器也可以修改存储过程的名称。 略
删除存储过程 • 删除存储过程 • 使用DROP命令删除存储过程 其语法形式如下: drop procedure {procedure} [,…n] 例如: 删除名为delete_authors的存储过程 drop procedure delete_authors • 利用企业管理器也可以很方便地删除存储过程。 略。
存储过程的应用 • 存储过程的执行 当需要执行存储过程时,请使用 Transact-SQL EXECUTE 语句。 • 格式 [ [ EXEC [ UTE ] ] { [ @return_status = ] {procedure_name [ ;number ] | @procedure_name_var } [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] ] [ ,...n ] [ WITH RECOMPILE ]
格式说明 @return_status 保存存储过程的返回状态。这个变量在用于 EXECUTE 语句前,必须在批处理、存储过程或函数中声明过。 procedure_name 需执行的存储过程名称。 @parameter 过程参数,在 CREATE PROCEDURE 语句中定义。参数名称前必须加上符号 (@)。在以 @parameter_name = value格式使用时,参数名称和常量不一定按照 CREATE PROCEDURE 语句中定义的顺序出现。但是,如果有一个参数使用 @parameter_name = value格式,则其它所有参数都必须使用这种格式。 value 是过程中参数的值。如果参数名称没有指定,参数值必须以 CREATE PROCEDURE 语句中定义的顺序给出。
格式说明 OUTPUT 指定存储过程必须返回一个参数。该存储过程的匹配参数也必须由关键字 OUTPUT 创建。
举例 • 使用存储过程delete_authors删除 编号为‘724-08-9931’作者 execute delete_authors '724-08-9931‘ 或 exe delete_authors @au_id_1='724-08-9931‘ • 使用存储过程au_info显示名为Smith的作者所写的每本书的标题和出版商。 exe au_info ‘smith’