《Oracle数据库管理与应用实例教程-6-事务》由会员分享,可在线阅读,更多相关《Oracle数据库管理与应用实例教程-6-事务(26页珍藏版)》请在金锄头文库上搜索。
1、Oracle数据库管理与应用实例教程,本章学习导航,本章学习导航,本章学习要点,(1)声明游标、打开游标、提取游标数据和关闭游标。 (2)循环处理游标。 (3)游标的更新。 (4)提交事务、回滚事务和设置保存点。 (5)锁的功能及其类型。,8.1 游标,游标的概念,游标(Cursor)是Oracle系统在内存中开辟的一块工作区,在该工作区中存放查询语句返回的结果集。 结果集可以包含零条数据记录、一条数据记录,也可以是多条数据记录。在定义游标所在的工作区中,存在一个指针,在初始状态下,游标指针指向查询结果集的第一条数据记录的位置。当执行FETCH语句提取数据记录后,游标指针将向下移动一个数据记录
2、的位置。 Oracle中的游标分为显示游标和隐式游标。 当查询返回的结果集超过一条数据记录时,就需要一个显式游标,此时用户不能使用SELECT INTO语句。显式游标在PL/SQL块的声明部分声明,在执行部分或异常处理部分打开、提取和关闭 PL/SQL管理隐式游标,当查询开始时隐式游标打开,查询结束时隐式游标自动关闭。,8.1 游标,游标的概念,游标通过以下方式扩展结果处理: 从结果集的当前位置检索一行数据记录; 支持对结果集的当前数据记录进行数据更新。 PL/SQL游标一般按以下步骤来使用: (1)声明游标; (2)打开游标; (3)提取游标数据; (4)对当前数据记录执行更新操作(可选);
3、 (5)关闭游标。,课堂案例1游标操作,学习使用Oracle 的PL/SQL语句声明游标、打开游标、提取游标数据和关闭游标的操作方法 。,案例学习目标,使用DECLARE CURSOR声明游标、使用OPEN CURSOR打开游标、使用FETCH提取游标数据、使用CLOSE CURSOR关闭游标 。,案例知识要点,课堂案例1游标操作,案例完成步骤-基本步骤,添加标题文字,1声明游标 声明游标,就是使一个游标与一条查询语句建立联系。 DECLARE CURSOR (参数1 数据类型,n) IS 查询语句 FOR UPDATE OF 用户方案. ,n; 2打开游标 就是执行游标定义时所对应的查询语句
4、,并把查询返回的结果集存储在游标对应的工作区中。 OPEN (参数1 ,n); 3提取游标数据 就是从定义游标的工作区中检索一条数据记录作为当前数据记录。 FETCH INTO 变量1 , n 4关闭游标 CLOSE ;,课堂案例1游标操作,案例完成步骤-实例,添加标题文字,【例1-1】使用游标查询商品表GOODS中第一款商品的信息。,8.1.3 游标的属性,游标的属性,添加标题文字,(1)%ISOPEN 描述游标是否已经打开,返回布尔型值。如果游标没有打开就直接使用FETCH语句提取游标数据,Oracle系统就会报告错误。 (2)%FOUND 描述最近一次FETCH操作的执行情况,返回布尔型
5、值。如果最近一次使用FETCH语句提取游标数据得到结果则返回TRUE,否则返回FALSE。 (3)%NOTFOUND 用于描述最近一次FETCH操作的执行情况,返回布尔型值。但与%FOUND属性不同的是,如果最近一次使用FETCH语句提取游标数据没有得到结果则返回TRUE,否则返回FALSE。 (4)%ROWCOUNT 用于描述截至目前从游标工作区提取的实现记录数。,8.1.3 游标的属性,游标的属性,【例1-3】使用游标查询商品表GOODS中所有商品的信息。,8.1.4 游标中的循环,游标中的循环,循环提取游标工作区内结果集的数据记录时,既可以通过LOOP循环来简单实现,也可以通过FOR循环
6、来实现复杂功能。而且,使用FOR循环提取游标数据时,与其他方法有些差异,主要表现在: 使用FOR循环提取游标数据时,Oracle系统自动打开游标,而不必显式地使用OPEN语句打开游标; Oracle系统隐含地定义了一个数据类型为%ROWTYPE的变量,并以此作为循环的计数器; Oracle系统自动重复从游标工作区内提取数据并放入计数器变量中; 当游标工作区内所有数据记录都被提取完成或者循环中止时,Oracle系统会自动关闭游标,8.1.4 游标中的循环,游标中的循环,【例1-4】使用游标查询商品表GOODS中“02”类型的所有商品的信息。 可以通过使用FOR循环提取游标的数据,并向游标内部传入
7、商品类别编号作为游标参数,8.1.4 游标的更新,游标的更新,UPDATE或DELETE语句中的WHERE CURRENT OF子句专门处理要执行UPDATE或DELETE操作的表中取出的最近的数据。要使用这个方法,在声明游标时必须使用FOR UPDATE子句,当对话使用FOR UPDATE子句打开一个游标时,所有返回集中的数据行都将处于行级(ROW-LEVEL)独占式锁定,其他对象只能查询这些数据行,不能进行UPDATE、DELETE或SELECT.FOR UPDATE操作。 在多表查询中,使用OF子句来锁定特定的表,如果忽略了OF子句,那么所有表中选择的数据行都将被锁定。如果这些数据行已经
8、被其他会话锁定,那么在正常情况下Oracle将等待,直到数据行解锁。 在UPDATE和DELETE中使用WHERE CURRENT OF子句的语法格式如下: WHERE CURRENT OF ,8.1.4 游标的更新,游标的更新,【例1-5】使用带FOR UPDATE子句的游标更新商品表GOODS中商品详细描述信息,并显示更新前后的信息,8.2 事务,事务概述,事务(Transaction)是Oracle系统中进行数据库操作的基本单位。 事务是一个操作序列,它包含了一组SQL语句,所有的SQL语句作为一个逻辑整体一起向Oracle系统提交或者撤销操作请求,即事务中的SQL语句要么都被执行,要么
9、都不被执行。 事务是Oracle系统中一个不可分割的逻辑工作单元。应用事务可以保证Oracle数据库的一致性和可恢复性,8.2 事务,事务概述,一个事务的逻辑工作单元必须具有以下属性。 (1)原子性(Atomicity) 一个事务必须作为Oracle系统工作的原子单位(在化学中,原子称为“不可再分的微粒”),事务要么全部执行,要么全部不执行。 (2)一致性(Consistency) 当事务完成之后,所有数据必须处于一致性状态,事务所修改的数据必须遵循Oracle数据库的各种完整性约束。 (3)隔离性(Isolation) 一个事务所做的更新操作必须与其他事务所做的更新操作保持完全隔离,在并发处
10、理过程中,一个事务所开始处理的数据必须为另一个事务处理前或者处理后的数据,而不能为另一个事务正在处理的数据。这种隔离性是通过Oracle的锁机制来实现的。 (4)永久性(Durability) 事务完成后,事务对数据库所做的更新被永久保持。 事务的上述4种属性也称为事务的ACID(取每种属性的英文名称的首字母组成)属性,课堂案例2事务处理,学习使用Oracle 的PL/SQL语句进行事务提交、事务回滚、事务撤销和设置保存点等操作 。,案例学习目标,使用COMMIT事务提交、使用ROLLBACK进行事务回滚、事务撤销和使用SAVEPOINT设置事务保存点 。,案例知识要点,课堂案例2事务处理,案
11、例完成步骤-事务提交,添加标题文字,1事务提交 事务提交(Commit)用于提交自上次提交以后对数据库中数据所做的改动。在Oracle数据库中,为了维护数据的一致性,系统为每个用户分别设置了一个工作区,对数据表中数据所做的添加、修改和删除操作都在工作区内完成。 在Oracle系统中,提交事务的命令是COMMIT,添加标题文字,课堂案例2事务处理,案例完成步骤-事务提交,添加标题文字,【例1-6】提交更新商品表GOODS的事务。 分析:在执行更新商品表GOODS的UPDATE语句后,只有当前用户可以看到数据库更新后的结果,此时还需要显式使用COMMIT命令(除非设置自动提交开关的状态为ON)提交
12、事务,以使数据更新生效。 -执行数据更新操作 UPDATE SCOTT.GOODS SET g_DESCRIPTION = 男人的衣柜,展现男人的魅力 WHERE g_ID = 040001; -提交事务 COMMIT;,添加标题文字,课堂案例2事务处理,案例完成步骤-事务回滚,添加标题文字,事务回滚(Rollback)是指当事务中的某一条SQL语句执行失败时,将对数据库的操作恢复到事务执行前或者某个指定位置。 ROLLBACK TO ; 【例1-7】更新商品表GOODS的信息,并回滚该事务。 -执行数据更新操作 UPDATE SCOTT.GOODS SET g_DESCRIPTION = N
13、ULL WHERE g_ID = 040001; -回滚事务 ROLLBACK;,添加标题文字,课堂案例2事务处理,案例完成步骤-设置保存点,添加标题文字,如果让事务回滚到指定位置,需要在事务中预先设置事务保存点(Save Point)。所谓保存点,是指在其所在位置之前的事务语句不能回滚的位置,回滚事务后,保存点之后的事务语句被回滚,但保存点之前的事务语句依然被有效执行,即不能回滚。 SAVEPOINT ;,添加标题文字,课堂案例2事务处理,案例完成步骤-设置保存点,添加标题文字,添加标题文字,8.3 锁,锁的概述,Oracle通过使用锁(Lock)机制维护数据的完整性、并发性和一致性。 Or
14、acle在两个不同级别上提供读取一致性:语句级读取一致性和事务级读取一致性。 (1)语句级读取一致性 Oracle总是实施语句级读取一致性,保证单个查询所返回的数据与该查询开始时刻保持一致。 (2)事务级读取一致性 事务级读取一致性是指在同一个事务中的所有数据对时间点是一致的。,8.3 锁,锁的类型,根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(Data Locks,数据锁),用于保护数据的完整性;DDL锁(Dictionary Locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(Internal Locks and Latches),保
15、护数据库的内部结构。 DML锁的目的在于保证并发情况下的数据完整性,在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。 当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志了,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。,8.3 锁,锁的类型,使用游标实现以报表形式显示BookData数据库中“未还”图书的信息(借书人、借书时间、图书名称、图书作者),任务1,在读者还书时,将对BorrowReturn的图书状态的修改操作和对BookStore表的图书状态的操作组合成一个事务进行处理,以保证同一本书的状态是一致的,任务2,