文档详情

第13讲事务与触发器讲述.ppt

发布:2017-04-04约9.58千字共28页下载文档
文本预览下载声明
回顾 存储过程(Procedure)的定义 输入参数 @参数名 输出参数 @参数名 output 执行状态值,0表示成功,-99~-1表示系统发现的执行错误,其余的值表示自定义的错误。 存储过程的执行 EXECUTE PROC 过程名 参数[output] … 数据库原理与应用 第13讲 事务与触发器 * * 提纲 重点 事务的四个特点:原子性,一致性,隔离性,持久性 触发器的实现方法 难点: 原子性,一致性,隔离性,持久性的理解 AFTER触发与INSTEAD OF触发的区别 1. 事务 关键词: BEGIN TRAN, COMMIT TRAN,ROLLBACK TRAN 思考: 余额表(帐号,余额) “001”账户向“002”账户转X元,手续费1%,需要完成如下2项数据操作: 操作1:001账户减X*1.01, 操作2:002账户加X. 完成以下存储过程proc_转帐,用于实现转帐业务的数据操作功能。 CREATE PROC proc_转帐 @inId char(20),--转进账户 @outId char(20),--转出账户 @amout int--转出账户数目 AS --SQL 体 注:001账户减少的钱数目,同时002账户和银行手续费账户必须有同等数目的钱进账。【由事物来维护数据库的一致性】 示例: 余额表(帐号,余额) “001”账户向“002”账户转X元,手续费1%,需要完成如下2项数据操作: 操作1:001账户减X*1.01, 操作2:002账户加X. 可能发生的错误如下: 可控的错误:没有001账号,没有002账号,001账号余额不足。 不可控的错误:操作1失败,操作2失败。 (事务定义见 代码) CREATE PROC proc_转帐 @inId char(20),--转进账户 @outId char(20),--转出账户 @amout int--转出账户数目 AS if NOT EXISTS(SELECT 账号 FROM 余额表 WHERE 账号=@outId) BEGIN Print 账号不存在 RETURN END if NOT EXISTS(SELECT 账号 FROM 余额表 WHERE 账号=@inId) BEGIN Print 对方帐号不存在 RETURN END if (SELECT 余额 FROM 余额表 WHERE 帐号=@outId) @amount*1.01 BEGIN PRINT 余额不足 RETUN END ELSE BEGIN BEGIN TRAN--事物开始 UPDATE 余额表 SET 余额=余额-@amount*1.01 WHERE 账号=@outId if @@error0 or @@rowcount1 ROLLBACK--@@error操作成功为0,@@rowcount操作成功为影响的行数 UPDATE 余额表 SET 余额=余额+@amount* WHERE 账号=@inId if @@error0 or @@rowcount1 ROLLBACK print 转账成功 COMMIT TRAN--事物结束 END ............ 示例分析 用if语句进行判断,在if后如果要执行多条语句,用begin…end。 print用于显示,如:print 余额不足,在每一个操作后进行错误跟踪,遇到一处错误则全部回退。 10.5 事务处理 1、事务(Transaction) 是一个逻辑工作单元。单元中的所有操作要么全部成功,要么全部取消。 2、事务的必要性 (1) 如果一个业务需要多个数据操作,而只有其中的部分操作成功,则数据的一致性将会被破坏。例如:银行转帐,至少需要两项操作:甲账户扣除,乙账户增加,不允许只有一项操作成功,而另一项失败。 (2)导致错误的原因可分为两类:一是可以预见的逻辑错误,比如账户不存在,余额不足等。二是不可预见的错误,比如DBMS停止服务、操作延时导致中断等等。 (3) 把一个业务所需的多个操作放入一个事务,可以保证所有操作作为一个单元来执行。 3、事务执行原理 事务作为一个整体提交,在提交之前,所有的操作被临时存放起来,并没有保存到数据库中。 任何一个操作错误,数据将回退到事务开始时的状态,临时更改被全部取消。 事务提交后,数据更新被保存到数据库。 4、T-SQL中管理事务 BEGIN TRAN [事务名]--开始事务 操作1 if 错误 ROLLBACK--回退 操作2
显示全部
相似文档