欢迎来到天天文库
浏览记录
ID:56444115
大小:66.00 KB
页数:26页
时间:2020-06-18
《Oracle数据一致性与事务管理.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、数据一致性与事务管理数据库中,除了数据的完整性之外,数据的一致性同样是一个重要的话题。而事务是保证数据一致性的重要手段。本章主要讲解数据的一致性,以及事务的管理。本章的主要内容包括:数据一致性简介;事务简介;Oracle中的事务处理;事务处理的原则。19.1什么是数据一致性和事务数据一致性是指数据库的数据在每一时刻都是稳定、而且是可靠的状态。而事务是保证数据一致性的主要手段。19.1.1数据一致性对于一个数据库来说,其中的数据可能是每时每刻都在发生着变化,而在数据变化的同时,也无时无刻不伴随着数据的读取。这就对数据库的状态产生了比较高
2、的要求——数据库的每次改变都是可被接受的,而每次读取的数据也都是正常的。这就是数据一致性的体现。例如,在某个用户的银行账户中,现有存款100元。此时,如果一个用户读取其中的数据为100元,那么,此时的100元是可以接受的数据。但在同一时刻,另一用户针对同一账户进行了以下操作,向其中存入了100元,但是还没有提交动作,那么,此时第一个用户有可能会读到200元的余额。事实上,由于某些原因,第二个用户的提交没有成功,那么第一个用户所读取的200元,并非数据库的真实和可靠的状态。这就造成了读不一致性。另外一种情形,如果第一个用户读取了200元
3、的同时,取出了100元,那么计算获得余额为100元。而第二个用户的存款动作失败,最后,第一个用户的余额重新覆盖数据库中的数据,那么就会将100再次写回数据库,这造成了取出100元,最后余额还为100元的状态,此时的数据库也不符合一致性的状态。19.1.2事务在数据库中,提出了事务的概念来保证数据库中数据的一致性。事务往往包括一个或多个处理步骤。例如,在超市购物包括,选购商品、放入购物车、付款、个人现金或银行账户余额减少、超市账户余额增加、商品库中商品信息更新等步骤。这些步骤组成了一个事务,当其中任何步骤出现异常,并且不能正常进行下去,
4、都会影响其他所有步骤。例如,付款阶段不能正常进行,那么将不会对个人的现金或银行账户造成影响,超市的账户也不可能进行余额的增加,商品库中也不能更新该商品的信息。同样的,如果个人现金或账户余额不足,那么也无法完成整个交易。在此之前所做的所有动作:选购商品、放入购物车等都将无效,商品应当被重新放回货架。19.2Oracle中的事务处理Oracle中的事务应当使用关键字transaction。一个事务的生命周期应当包括:事务开始、事务执行和事务结束。需要注意的是,Oracle中并不能显式开始一个事务,也不存在这样的语句。事务的开始总是隐式进行
5、的,而事务的结束则可以利用commit或者rollback命令进行终止。Oracle中控制事务的常用命令包括:Commit;rollback;savepoint;rollbackto;settransaction;setconstraint。19.2.1commit命令commit命令用于提交事务,并将事务中对数据库的修改进行持久化,即将数据库修改为另外一种状态,而这种状态是可接受的、可靠的状态。whilei<1000loopupdatepeoplesetsalary=salary+10*iwhereid=i;i
6、:=i+1;endloop;commit;对于开发者来说,最安全的方式是显式进行数据的提交或者回滚,以结束事务。但很多时候,许多开发者并未注意该问题,而是依靠开发工具来进行提交或回滚。此时需要注意的是,如果用户未提交对数据库的修改,而关闭了回话,或者数据库连接在提交之前断开,那么针对该数据库的所有操作都将执行回滚操作。19.2.1commit命令另外,需要明确的概念是,在提交之前,数据库已经进行了实际更新,不过,并未得到数据库认可,因此提交动作只是一个获得认可的过程,其花费的数据库资源非常少。而且,提交一条数据与提交1000条数据所花
7、费的数据库资源是相同的。因此,当实现大数据量的数据修改或者插入操作时,应当采取最后一次性提交的策略。whilei<1000loopupdatepeoplesetsalary=salary+10*iwhereid=i;i:=i+1;commit;endloop;在该代码片段中,每次更新数据,都有一次提交动作,将造成数据库资源的浪费。19.2.2rollback命令rollback命令用于回滚用户操作。在某些时机,例如程序代码段中出现异常或错误,或者用户直接发出撤销命令,需要回滚操作。回滚操作将终止事务处理,并撤销用户在当前事务中进行的更
8、改。beginwhilei<1000loopupdatepeoplesetsalary=salary+10*iwhereid=i;i:=i+1;endloop;exceptionrollback;end;回滚操作,首先要
此文档下载收益归作者所有