三峡大学韩芳oracle11事务和锁

上传人:今*** 文档编号:106891632 上传时间:2019-10-16 格式:PPT 页数:37 大小:2.64MB
返回 下载 相关 举报
三峡大学韩芳oracle11事务和锁_第1页
第1页 / 共37页
三峡大学韩芳oracle11事务和锁_第2页
第2页 / 共37页
三峡大学韩芳oracle11事务和锁_第3页
第3页 / 共37页
三峡大学韩芳oracle11事务和锁_第4页
第4页 / 共37页
三峡大学韩芳oracle11事务和锁_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《三峡大学韩芳oracle11事务和锁》由会员分享,可在线阅读,更多相关《三峡大学韩芳oracle11事务和锁(37页珍藏版)》请在金锄头文库上搜索。

1、事务和锁,Oracle数据库与应用,事务和锁,制作人:韩芳 电 话:13972542992 邮 箱:393963877 三峡大学计算机与信息学院,数据一致性,对于一个数据库来说,其中的数据可能是每时每刻都在发生着变化,而在数据变化的同时,也无时无刻不伴随着数据的读取。这就对数据库的状态产生了比较高的要求数据库的每次改变都是可被接受的,而每次读取的数据也都是正常的。这就是数据一致性的体现。,1.什么是事务,在数据库中,提出了事务的概念来保证数据库中数据的一致性。 事务是一组包含了一条或者多条语句的逻辑单元,事务中的语句被视为一个整体,要么一起被提交,是数据库数据永久的修改;要么一起被撤销,被数据

2、库不做任何的修改 经典的例子:银行转账,1.什么是事务,事务往往包括一个或多个处理步骤。例如,在超市购物包括 选购商品、放入购物车、付款、个人现金或银行账户余额减少、超市账户余额增加、商品库中商品信息更新等步骤。这些步骤组成了一个事务,当其中任何步骤出现异常,并且不能正常进行下去,都会影响其他所有步骤。 例如,付款阶段不能正常进行,那么将不会对个人的现金或银行账户造成影响,超市的账户也不可能进行余额的增加,商品库中也不能更新该商品的信息。 同样的,如果个人现金或账户余额不足,那么也无法完成整个交易。在此之前所做的所有动作:选购商品、放入购物车等都将无效,商品应当被重新放回货架。,1.什么是事务

3、,一个事务的生命周期应当包括: 事务开始(Oracle中并不能显式开始一个事务,也不存在这样的语句) 事务执行 事务结束(commit或者rollback命令) Oracle基本控制语句 set transaction commit savepoint rollback rollback to savepoint,2 事务的类型,(1)显式事务 01 新事务开始 02 sql statement 03 04 commit | rollback (2) 隐式事务 没有明确的开始和结束标志,由数据库自动开始,当一个程序正常结束或者使用DDL语言自动提交,而当操作失败时也会自动回滚。如果设置anto

4、commit为打开状态(默认关闭),则每次执行DML操作都会自动提交。 语法:set autocommit on/off,commit命令,事务在什么情况下结束需要注意: 否则有丢失数据的可能,当有下列情况之一的时候事务会结束: 使用commit事务提交,rollback事务回滚 执行语句,事务自动提交,例如:createdropgrantrevoke等命令 正常退出SQLplus 时自动提交事务,非正常 退出则rollback事务回滚,commit命令,commit命令用于提交事务,并将事务中对数据库的修改进行持久化,即将数据库修改为另外一种状态,而这种状态是可接受的、可靠的状态。 whil

5、e i1000 loop update people set salary = salary + 10*i where id = i; i := i+1; end loop; commit; 对于开发者来说,最安全的方式是显式进行数据的提交或者回滚,以结束事务。但很多时候,许多开发者并未注意该问题,而是依靠开发工具来进行提交或回滚。 此时需要注意的是,如果用户未提交对数据库的修改,而关闭了会话,或者数据库连接在提交之前断开,那么针对该数据库的所有操作都将执行回滚操作。,commit命令,另外,需要明确的概念是,在提交之前,数据库已经进行了实际更新,不过,并未得到数据库认可,因此提交动作只是一个

6、获得认可的过程,其花费的数据库资源非常少。而且,提交一条数据与提交1000条数据所花费的数据库资源是相同的。因此,当实现大数据量的数据修改或者插入操作时,应当采取最后一次性提交的策略。 while i1000 loop update people set salary = salary + 10*i where id = i; i := i+1; commit; end loop; 在该代码片段中,每次更新数据,都有一次提交动作,将造成数据库资源的浪费。,roll back命令,roll back命令用于回滚用户操作。在某些时机,例如程序代码段中出现异常或错误,或者用户直接发出撤销命令,需要回

7、滚操作。回滚操作将终止事务处理,并撤销用户在当前事务中进行的更改。 begin while i1000 loop update people set salary = salary + 10*i where id = i; i := i+1; end loop; exception roll back; end; 回滚操作,首先要读取回滚段信息,并利用这些信息将数据库中已发生的修改重新恢复。例如,对于使用了update操作的列,则需要将其恢复到原值,而使用了delete操作的行,则需要再次执行插入操作。因此,回滚操作所需要的时间和花费的资源,依赖于在事务中所执行的数据库更改,并与之成正比。 通

8、常情况下,回滚操作是非常耗费时间和资源的,因此,回滚往往被用于处理异常,而不用作终端用户的可操作选项。一旦终端用户经常性使用回滚操作,那么将为数据库带来非常大的负担。 应当保证终端用户在提交事务之前进行确认,来代替允许用户执行回滚,从而实现提交与回滚操作的平衡。,3 事务的保存点,保存点可以设置在事务中的任何 地方,也可以设置多个点,这样就将较长的事务分割成较小的段,这样做的好处是,当对事务的操作发生问题的时候,只需要回滚到保存点处即可 需要注意以下问题 事务只回滚到保存点之后的操作 回滚到某保存点时候,它之后的保存点将被删除,但保存点会被保留 保存点以后的锁将会被释放,3 事务的保存点,in

9、sert into users values(05,aa,测试1,123); Savepoint fst; Insert into users values(06,bb,测试2,123); select * from users; rollback to fst; select * from users; Commit;,事务的属性和隔离级别,事务本身存在着一些属性,这可以保证事务以某种特定的规则运行。所谓隔离,是指将事务所能看到的数据库状态与其他事务分隔开来 1read only属性 set transaction read only; insert into people(id, name

10、, status) values (13, youyou, ACT); commit; 只读事务的这种特性,可以提供一种稳定的状态,从而处理大量的数据查询工作。例如,在生成复杂报表时,需要查询大量数据,而这些数据又是频繁变更的,在处理报表的过程中,可以利用只读事务来提供稳定的环境,以使生成的报表有意义。,事务的属性和隔离级别,2read write属性 read write属性可以将事务设置为可读、可写状态。这实际是事务的默认状态,因此,该属性的显式设定,并没有太大的现实意义。 需要注意的是,一旦使用set transaction read write命令,那么该命令之前,不能出现set tr

11、ansaction命令之外的其他命令。,事务的属性和隔离级别,3serializable隔离级别 serializable隔离级别是指串行化事务。串行化事务可以实现与只读事务实现相同的功能隔离其他事务对数据库状态的影响。但是串行化事务允许在其中执行任何DML操作,包括删除、修改、插入数据等。 在默认情况下,一个事务可以识别其他事务针对数据库的修改,而这种修改仅限于已经提交到数据库的修改。使用了串行化事务,那么,其他事务已经提交的修改也将被隔离。这里所说的隔离,实际是对于查询操作来说,也就是串行化事务的处理过程中,无法查看到其他事务的修改。 set transaction isolation l

12、evel serializable;,事务的属性和隔离级别,4read commited隔离级别 read commited隔离级别是事务的默认隔离级别,即只能读取其他事务已经提交的修改。对于尚未提交的修改,只有实现该修改的事务本身可以进行读取。,4 事务的特性,原子性(Atomicity):整个事务不可分割,要么全部执行,要么都不执行。 一致性(Consistency):事务一旦提交生效,会将数据库从一种状态转变为另一种状态。隔离性(Isolation) 隔离性(Isolation): 在事务处理的过程中,事务处理的效果对于其他事务,是完全透明的。 持久性(Durablity):一旦提交了事

13、务处理,那么事务处理的效果将永久生效。,隔离性,1脏读取(Dirty Read) 脏读取意味着,可以读取来自外界其他动作对数据库的修改,而这种修改尚未提交,未提交的数据有可能回滚。也就是说,读取的数据并非真正有效的数据,这将直接破坏数据一致性。 2不可重读 不可重读意味着,如果用户在某一时刻读取了一条记录,那么,在下一时刻再次读取时,该记录已发生改变。其状态类似于“人不能两次踏入同一条河流”。不可重读并非不可接受的,相反,不可重读是一种正常的数据库状态。这与脏读取是有本质区别的。 3影像读取 影像读取意味着,如果用户在某一时刻执行了一个查询,在下一时刻再次执行相同查询时,可能会有新的数据加入。

14、但是,已经读取的数据是不会改变的,只是查询所获得结果集更大而已。,19.3.4 持久性,持久性是指,当事务一旦提交,其改变将会生效,并将信息存储在磁盘上。当系统再次重新启动或者故障时,这些信息不会丢失。 对于提交动作来说,用户见到提交成功提示时,Oracle并未完成持久化工作。但是,Oracle数据库利用redo日志文件来保证系统的持久性。redo文件在事务提交的前一刻生成,其中记录了一旦提交时,系统崩溃,那么该如何将事务的工作再次执行,以保证事务真正执行完毕,并持久化到数据库。,并发控制,并发是指多用户同时访问数据库。并发能力是衡量数据库性能的重要指标之一,数据库允许并发数量越大,标志着该数

15、据库的性能越好。另一方面,并发会给保持数据库一致性带来挑战。Oracle在并发方面有着卓越的性能,并有着完善的并发控制机制。,什么是锁,锁出现在数据共享的环境中,它是一种机制,在访问相同的资源的时候,可以防止事务之间的破坏性交互。例如:当多个会话同时操作某表的时候,有限操作的会话需要对其锁定 事务的隔离性要求当前事务不能影响其他事务,所以,当多个会话访问相同的资源的时候,Oracle 会利用锁来确保他们想队列一样被依次执行。Oracle处理数据时候用到的锁匙自动获取的,我们不用对此有过多的关注,但是Oracle允许我们手动锁定数据 行级锁:Oracle利用很低的约束提供了最大程度的并发,例如,

16、当某会话正在修改一条记录,那么仅该条记录被锁定,而其他会话可以随时做读取操作,读取的是修改之前的数据;如果另一回话企图做跟 更新操作,那么只能等待,这样可以避免脏数据的产生,Oracle中锁的分类,排他锁(X锁):也叫写锁,这种锁用作数据的修改,加入有事务给数据A加上该锁,那么其他的事务不能对A加任何锁,所以此时只允许事务T对A进行读取和修改,直到事务完成所有操作后释放锁 共享锁(S锁):该模式锁下的数据只能被读取,不能被修改,如果有事务T给数据A加上S锁,那么其他事务不能对A加排他锁,但可以加共享锁,可以保证并发的读取。 Oracle数据库中锁应用频繁,但是多数都由自动管理,当事务提交后自动释放锁,锁的类型,锁:该类型的锁被称为“数据锁”,用于保护数据 锁:可以保护数据库汇总对象的结构 内部闩锁:保护数据库的内部结构,完全自动调用 Distributed locks(分布式锁):用于OPS(并行服务器)中; PCM locks(并行高速缓存管理锁):用于OPS(

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号