欢迎来到天天文库
浏览记录
ID:37796404
大小:264.81 KB
页数:16页
时间:2019-05-31
《数据库一致性与事务管理》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第19章数据库一致性与事务管理数据库中的数据是每时每刻都有可能发生变化的。但是这种变化必须是可以接受的和合理的。即数据必须保持一致性。事务是保证数据一致性的重要手段。本章将从以下几个方面讲述数据一致性。什么是数据库一致性和事务Oracle中的事务事务的属性和隔离级别事务的处理原则通过本章的学习,读者可以对数据一致性有清晰的认识,并了解Oracle中的事务处理原则。19.1数据一致性和事务用户对数据库的操作是复杂多变的。这些复杂的动作可能是一个逻辑整体,如果处理不当极易造成数据不一致。同属一个逻辑整体的操作应该作为一个事务进行处理,从而避免出现数据不一致性。19.1.1Orac
2、le中的数据一致性数据库是现实世界的反映。例如,一个存储了多家连锁店铺库存信息的数据库,如果需要进行货物调配,则需要进行数据更新。从A店调出的货物送至B店,那么A店对应的库存量应该进行削减,B店库存进行相应增加。在数据库中的实际操作应该是两条SQL语句,一条语句减少A店库存,另外一条增加B店库存。但是,数据库有可能抛出这样那样的异常,例如,第一条语句执行完毕,突然断电,或者第二条语句由于其他原因(如表本身的约束)而没有执行成功,就造成了数据不符合实际情况,即实际库存与数据库记录不符。类似的场景还有很多,但作为存储基础数据的数据库,必须避免任何犯错的可能,即必须保持数据一致性。
3、19.1.2Oracle中的事务事务是保证数据一致性的重要手段。试图改变数据库状态的多个动作应该视作一个密不可分的整体。无论其中经过了多么复杂的操作,该整体执行之前和执行之后,数据库均可保证一致性。整个逻辑整体即使一个事务。19.2Oracle中的事务处理一个事务的生命周期包括,事务开始、事务执行和事务结束。在Oracle中,并不会显式声明事务的开始,而是由Oracle自行处理。事务的结束可以利用commit或者rollback命令。本节将从以下角度讲述Oracle中的事务处理。利用Commit命令结束事务利用Rollback命令结束事务事务属性和隔离级别19.2.1利用co
4、mmit命令界定事务事务的开始无需显式声明,在一个会话中,一次事务的结束便意味着新事务的开始。事务的结束可以利用commit命令,如示例19-1所示。【示例19-1】利用commit命令界定事务。在表warehouse中存储了仓库及库存信息,如下所示。SQL>select*fromwarehouse;19.2.2利用rollback命令界定事务rollback命令用于回滚事务内的所有数据修改,并结束事务。在示例19-1中,无论进行了多少次调仓,使用rollback命令将忽略所有操作。【示例19-2】利用rollback命令界定事务。SQL>updatewarehouseset
5、stock=stock-100wherewarehouse_name='A仓'andgoods='衬衫';1rowupdatedSQL>updatewarehousesetstock=stock+100wherewarehouse_name='B仓'andgoods='衬衫';19.2.3Oracle事务的属性和隔离级别Oracle中,可以设定事务的属性和隔离级别,以保证事务运行在某种特定环境。因为数据库状态总是在不断进行变化的,特定的环境有利于事务在一个稳定的状态下工作。这些属性和隔离级别包括:readonly属性;readwrite属性;serializable隔离级别;
6、readcommited隔离级别。1.readonly属性2.readwrite属性3.serializable隔离级别4.readcommited隔离级别19.3事务处理原则事务并非Oracle数据库的专利,而是被广泛应用,并具有统一的处理原则。事务的处理原则包括以下几点:原子性(Atomicity):一致性(Consistency):隔离性(Isolation):持久性(Durablity):19.3.1事务的原子性——Atomicity原子性是事务的最基本属性。当事务被提交时,所有数据修改都将被确认;当事务回滚时,所有数据修改都将被忽略。不能出现部分提交部分忽略的情形。
7、当然,具体的实现细节均由数据库实现。对于用户来说,只需使用commit/rollback命令来提交/回滚事务即可。19.3.2事务的一致性——Consistency事务的一致性是指,在事务开始之前数据库处于一致性状态,当事务结束之后,数据库仍然处于一致性状态。也就是说,事务不能破坏数据库一致性。很多情况下,事务内部对数据库操作有可能破坏数据库一致性。例如,在货物调仓的过程中,出仓操作是成功执行的,而入仓失败。此时的事务,如果执行了commit动作,势必破坏数据库的一致性。那么,正确的做法应该是以roll
此文档下载收益归作者所有