欢迎来到天天文库
浏览记录
ID:38569105
大小:349.82 KB
页数:26页
时间:2019-06-15
《Oracle之事务与并发控制》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第十一章事务与并发控制当用户建立与数据库的会话后,用户就可以对数据库的进行操作,而用户对数据库的操作是通过一个个事务来进行的。事务确保用户对数据库逻辑操作的完整性和一致性,这里的逻辑操作是指用户根据业务逻辑而进行的一系列操作。本章学习目标:事务的概念,主要了解事务的ACID特性、处理过程。在Oracle中设置事务的隔性层事务处理语句事务的并发控制最基本锁的作用和使用死锁的发生锁定的多粒度性Oracle中的多粒度意向锁11.1了解事务在介绍Oracle10g的事务处理之前,首先需要理解什么是数据库中的事务。事务其实是一个很简单的概念,用户每
2、天都会遇到许多现实生活中类似事务的示例。例如,商业活动的中的交易,对于任何一笔交易来说,都涉及两个基本动作:一手交钱和一手交货。这两个动作构成了一个完整的商业交易,缺一不可。也就是说,这两个动作都成功发生,说明交易完成;如果只发生一个动作,则交易失败。所以,为了保证交易能够正常完成,需要某种方法来保证这些操作的整体性,即这些操作要么都成功,要么都失败。11.2事务的ACID特性一组SQL语句操作要成为事务,数据库管理系统必须保证这组操作的原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(D
3、urability),这就是事务的ACID特性。11.2.1原子性(Atomicity)事务的原子性是指事务中包含的所有操作,要么全做,要么全不做;是一个最小和不可分割(原子)的操作,以确保数据库的一致性。例如:用户SCOTT在同一个银行有A,B两个帐号,分别存有2000元和1000元,这时候SCOTT使用A帐号转账500元到B帐号,转账的时候先从A帐号扣掉500,A的帐号现在只有1500,B帐号在同一时刻只有1000元,这时候必须在B帐号增加500元,帐号数据才是正确的,如果在B帐号增加500元的操作的不成功,那么必须在A帐号上的操作必须
4、回滚,以确保帐号的数据的完整性。所以我们把这两个对数据库的操作(insert,delete,update)做为一个操作单元,它们是不能分割的,即事务的原子性。(注意:存储过程与触发器都是经过了原子处理。)11.2.2一致性(Consistency)所谓一致性是指数据库中事务操作前和事务处理后,其中的数据必须都满足业务规则约束。如上述的例子,转账前后的总金额必须相同。虽然在事务的过程会出现短暂的不一致,这也是暂时的,当事务提交时,数据库必须恢复到一致状态。11.2.3隔离性(Isolation)隔离性是数据库允许多个并发事务同时对其中
5、的数据进行读写和修改能力,隔离性可以防止多个事务在并发执行时,由于它们的操作命令交叉执行而导致数据的不一致状态。11.2.4持久性(Durability)事务的持久性表示为:当事务处理结束后,该事务对数据的修改是永久的,即使是系统遇到故障的情况下也不会丢失的。11.3事务控制语句在Oracle中没有提供开始事务处理语句,所有的事务都是隐式开始的。也就是说,在Oracle中用户不可以显式使用命令来开始一个事务。Oracle认为第一条修改数据库的语句,或者一些要求事务处理的场合都是事务隐式的开始。但是,当用户想要终止一个事务处理时,必须显式使用
6、COMMIT和ROLLBACK语句结束。针对事务的ACID特点,Oracle提供了如下语句对事务进行控制:SETTRANSACTION设置事务的属性SETCONSTRAINS在当前事务中设置约束模式SAVEPOINT在事务中建立一个存储点RELEASESAVEPOINTROLLBACKCOMMIT11.3.1设置事务属性SETTRANSACTION该语句可用来设置事务各种属性,而且是在事务处理中使用的第一个语句。它可以让用户对事务以下的属性进行设置:指定事务的隔离层规定事务回滚时所使用的存储空间命名事务(注意:SETTRANSACTION
7、只对当前要处理的事务进行设置,当事务结束时,对事务的属性的设置也将失效)事务隔离层定义了一个事务与其他事务的隔离程度。在并发事务中会发生如下异常:错读错读就是事务A对数据进行修改,而另外事务B读取了修改后的数据,由于某种原因A取消了对数据的修改,使数据返回到原来的状态,而B原来读取的数据与数据库的数据不符。非重复读是指事务A读取了数据,而事务B随后更改了该数据,而A再次读取该数据时,就会发现数据已经变化,同一个事务前后两次读取的数据不相同。假读事务A基于某个条件查找数据后,事务B更新了同一个表中的数据,当A再次根据相同的搜索条件返
8、回了不同的行。上述三种异常的发生,都与事务的隔离层的设置有关。选择隔离层:READCOMMITTED这是Oracle默认的隔离层SERIALIZABLE序列化,事务与事务完全隔开
此文档下载收益归作者所有