- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
3.5SQL中的事务
3.5 SQL中的事务 3.5.1 事务的概念 首先请看一个例子:假设银行有一笔转账业务,需要将账户1的$1000元转入账户2中。数据库应用程序至少需要执行以下两步完成此转账功能: 第一步:修改数据库中账户1的资金余额balance1,使balance1=balance1-1000; 第二步:修改数据库中账户2的资金余额balance2,使balance2=balance2+1000;这两步完成后,balance1+balance2的和应保持不变。 试想如果在执行第一步后,系统出现了故障,此时账户1上减去的$1000元还没来得及存入账户2,造成了数据库状态的不一致。显然,为了保证数据库状态的一致性,这个转账操作中的两步要么全部完成,要么由于出错而全不发生。 为此,SQL中提出了事务的概念。所谓 事务,就是用户定义的一个数据库操作序列,是一个不可分割的工作单位。不论有无故障,数据库系统必须保证事务的正确执行——或者执行整个事务或者属于该事务的操作一个也不执行。SQL的一个事务,可以是一条SQL语句、一组SQL语句或整个程序。一般地,一个程序中包含有多个事务。 事务的开始和结束可以由用户显式控制。如果没有显式地定义事务,则由具体的DBMS按缺省规定自动划分事务。在SQL语言中,处理事务的语句有以下三条: BEGIN TRANSACTION COMMIT ROLLBACK (1)BEGIN TRANSACTION:定义事务开始。事务通常以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。但在大部分的DBMS中,当对数据库或者数据库模式进行查询或更新的任何SQL语句开始时,事务也就开始了。 (2)COMMIT(提交):使事务成功地结束。自从当前事务开始后SQL语句所造成的所有对数据库的更新将写回到磁盘上的物理数据库中去(也即,把改变的内容提交了)。在COMMIT语句执行以前,改变都是暂时的,对其他事务可能可见也可能不可见。 执行了COMMIT后, 所执行事务对数据库的所有更新将永远存在。 所有用户都将感受这一点, 如图 3 ― 2(a)所示。 (3) ROLLBACK(回滚): 即在事务的运行过程中发生了某种故障, 事务不能继续执行, 影响该事务的SQL语句所造成的任何改变全部作废, 滚回到事务开始前的状态, 如图 3 ― 2(b)所示。 事务可以嵌套使用。 一个嵌套事务可以包含若干个子事务。 嵌套的事务可形成一种树结构, 如图 3 ― 3 所示。 最顶端(或最外层)的事务是一个根, 根下可有一个或多个子事务, 子事务还可以再包含更下一级的子事务。 在嵌套事务中, 必须先完成所有的子事务后, 才能提交顶级事务。 完成子事务包括提交或回滚子事务。 如果最外层事务提交失败, 则不管子事务是否已提交, 所有的子事务都将回滚(子事务对数据的操作将被全部撤消)。 例 3.18 考虑前面的银行转账例子, 设银行数据库中有一账户关系Accounts, 有属性acctNo和balance, 分别表示账户号和该账户的余额。 以下是用C语言和嵌入式SQL语句编写的转账程序。 EXEC SQL BEGIN DECLARE SECTION; Int acct1, acct2; /* 存放两个账户号 */ Int balance1; /* 存放第一个账户的余额 */ Int amount; /* 存放转账的资金 */ Int code; EXEC SQL END DECLARE SECTION; … /* C代码, 提示用户输入账户1和账户2以及需转账 */ … /* 的金额, 分别放入变量acct1acct2和amount中 */ EXEC SQL SELECT balance INTO∶ balance1 /* 读账户1的余额 */ FROM Accounts WHERE acctNo=∶ acct1; If(b
原创力文档


文档评论(0)