- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
 - 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
 - 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
 - 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
 - 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
 - 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
 - 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
 
                        查看更多
                        
                    
                第 19 章 数据一致性与事务管理 数据库中,除了数据的完整性之外,数据的一致性同样 是一个重要的话题。而事务是保证数据一致性的重要手段。 本章主要讲解数据的一致性,以及事务的管理。本章的主要 内容包括: ? 数据一致性简介; ? 事务简介; ? Oracle 中的事务处理; ? 事务处理的原则。 19.1   什么是数据一致性和事务 数据一致性是指数据库的数据在每一时刻都是稳定、而 且是可靠的状态。而事务是保证数据一致性的主要手段。 19.1.1   数据一致性 对于一个数据库来说,其中的数据可能是每时每刻都在发生 着变化,而在数据变化的同时,也无时无刻不伴随着数据的读取 。这就对数据库的状态产生了比较高的要求 —— 数据库的每次改 变都是可被接受的,而每次读取的数据也都是正常的。这就是数 据一致性的体现。 例如,在某个用户的银行账户中,现有存款 100 元。此时, 如果一个用户读取其中的数据为 100 元,那么,此时的 100 元是可 以接受的数据。但在同一时刻,另一用户针对同一账户进行了以 下操作,向其中存入了 100 元,但是还没有提交动作,那么,此时 第一个用户有可能会读到 200 元的余额。事实上,由于某些原因, 第二个用户的提交没有成功,那么第一个用户所读取的 200 元,并 非数据库的真实和可靠的状态。这就造成了读不一致性。 另外一种情形,如果第一个用户读取了 200 元的同时,取出 了 100 元,那么计算获得余额为 100 元。而第二个用户的存款动作 失败,最后,第一个用户的余额重新覆盖数据库中的数据,那么 就会将 100 再次写回数据库,这造成了取出 100 元,最后余额还为 100 元的状态,此时的数据库也不符合一致性的状态。 19.1.2   事务 在数据库中,提出了事务的概念来保证数据库中数据 的一致性。事务往往包括一个或多个处理步骤。例如,在超 市购物包括,选购商品、放入购物车、付款、个人现金或银 行账户余额减少、超市账户余额增加、商品库中商品信息更 新等步骤。这些步骤组成了一个事务,当其中任何步骤出现 异常,并且不能正常进行下去,都会影响其他所有步骤。例 如,付款阶段不能正常进行,那么将不会对个人的现金或银 行账户造成影响,超市的账户也不可能进行余额的增加,商 品库中也不能更新该商品的信息。 同样的,如果个人现金或账户余额不足,那么也无法 完成整个交易。在此之前所做的所有动作:选购商品、放入 购物车等都将无效,商品应当被重新放回货架。 19.2  Oracle 中的事务处理 Oracle 中的事务应当使用关键字 transaction 。一个事 务的生命周期应当包括:事务开始、事务执行和事务结束。 需要注意的是, Oracle 中并不能显式开始一个事务,也不存 在这样的语句。事务的开始总是隐式进行的,而事务的结束 则可以利用 commit 或者 rollback 命令进行终止。 Oracle 中控制事务的常用命令包括: Commit ; roll back ; savepoint ; roll back to savepoint ; set transaction ; set constraint 。 19.2.1  commit 命令 commit 命令用于提交事务,并将事务中对数据库的修 改进行持久化,即将数据库修改为另外一种状态,而这种状 态是可接受的、可靠的状态。 while i1000 loop  update people set salary = salary + 10*i where id = i; i := i+1; end loop; commit; 对于开发者来说,最安全的方式是显式进行数据的提 交或者回滚,以结束事务。但很多时候,许多开发者并未注 意该问题,而是依靠开发工具来进行提交或回滚。 此时需要注意的是,如果用户未提交对数据库的修改 ,而关闭了回话,或者数据库连接在提交之前断开,那么针 对该数据库的所有操作都将执行回滚操作。 19.2.1  commit 命令 另外,需要明确的概念是,在提交之前,数据库已经 进行了实际更新,不过,并未得到数据库认可,因此提交动 作只是一个获得认可的过程,其花费的数据库资源非常少。 而且,提交一条数据与提交 1000 条数据所花费的数据库资 源是相同的。因此,当实现大数据量的数据修改或者插入操 作时,应当采取最后一次性提交的策略。 while i1000 loop  update people set salary = salary + 10*i where id = i; i := i+1; commit; end loop;  在该代码片段中,每次更新数据,都有一次提交动作 ,将造成数据库资源的浪费。 19.2.2  roll b
                
原创力文档
                        

文档评论(0)