一、涉及内容
1.理解事务的概念和几个特性。
2.熟练掌握事务管理命令的使用。
3.理解并发操作的概念和数据库锁的类型。
二、具体操作
(12.5 实验)
1. 分析以下代码,说出代码中的哪些部分体现了事务的语句级原子性、过程级原子性和事务级原子性。
create table book(bid number(4) CONSTRAINT pk_bid PRIMARY KEY DEFERRABLE INITIALLY IMMEDIATE, bname varchar2(30), bprice number(4,1));insert into book values(1001,'Oracle 10g 数据库开发',35.4);insert into book values(1001,'Java 程序设计',40);begininsert into book values(1002,'Java 程序设计',40);insert into book values(1002,'计算机英语',28);end;insert into book values(1003,'计算机英语',28);commit;
答:
(1)体现语句级原子性:上述代码中的每一条语句均能体现语句级原子性。每条语句本身也是最小级别的事务,该语句要么完全执行成功,要么完全失败,并且它不会影响其他语句的执行。
(2)体现过程级原子性:
以下这个匿名块:
begin
insert into book values(1002,'Java 程序设计',40);
insert into book values(1002,'计算机英语',28);
end;
这里PL/SQL匿名过程块也当作是语句,当作一个整体,过程中的所有代码要么都执行成功,要么都执行失败,并且不影响过程外的其他语句。
(3)体现事务级原子性:
上述代码中的所有语句及匿名块,即整个事务中的所有语句和匿名块都当作一个整体,一个事务。用户在提交或回滚事务时,要么所有语句都执行,要么都失败。
事务级原子性中包含了语句级原子性和过程级原子性,整个事务中的语句或匿名块首先受语句级原子性和过程级原子性的影响。
2. 数据库的DDL命令作为一个独立的事务执行,若以下代码在Sql*Plus的窗口1执行,那么在Sqlplus的窗口2中能够看到哪些新数据?
insert into scott.emp(empno,sal) values(1001,3000);insert into scott.emp(empno,sal) values(1002,3000);create table t1(id number);insert into scott.emp(empno,sal) values(1003,3000);
在Sql*Plus的窗口1执行上述代码:
在Sqlplus的窗口2中查看scott.emp(empno,sal):
如上图所示,在Sqlplus的窗口2只能查看到在Sqlplus的窗口1中执行代码的create 之前的插入的数据。
3. 使用ROLLBACK可以将事务回滚到某个保存点,分析以下代码执行的结果。
insert into scott.emp(empno) values(1011);SAVEPOINT aa;insert into scott.emp(empno) values(1012);ROLLBACK to aa;insert into scott.emp(empno) values(1013);commit;
答:执行结果截图如下:
因为使用了ROLLBACK,可将事务回滚到某个保存点。故上述代码执行完后只能看到插入的1011和1013两条记录的数据。
4. 利用第一题中创建的book表,分析以下两段代码的执行结果有何不同?
代码段一:
insert into book values(1011,null,null);insert into book values(1011,null,null);commit;
执行结果截图:
代码段二:
set CONSTRAINT pk_bid deferred;insert into book values(1011,null,null);insert into book values(1011,null,null);commit;
执行结果截图:
答:代码段一中插入两条一样的记录,违反主键约束,插入重复的记录失败。代码段二中,设置了约束延迟生效,插入重复的记录暂时成功,但是当提交事务时检查约束,违反了主键约束,整个事务被回滚,两条看似成功的insert命令都失败了。
5.按照以下要求书写代码并执行,根据实验结果说明事务在不同隔离级别下的特点。
打开3个Sqlplus窗口,在窗口1中向scott.emp表中插入一行新数据,在窗口2中设置事务的隔离属性是READ ONLY,在窗口3中设置事务的隔离属性是READ WRITE。在窗口1提交插入命令的前后,观察窗口2和窗口3 中能否看到这条新数据。尝试在窗口2和窗口3中分别向scott.emp表中插入新数据,看看能否成功。
(1)在窗口1中向scott.emp表中插入一行新数据:
(2)在窗口2中设置事务的隔离属性是READ ONLY;
(3)在窗口3中设置事务的隔离属性是READ WRITE;
(4)窗口1提交前,观察窗口2和窗口3 中均不能看到这条新数据;
(5)窗口1提交后,观察窗口2还是不能看到;而窗口3 中可以看到这条新数据;
(6)在窗口2向scott.emp表中插入新数据,不能成功。
(7)在窗口3中向scott.emp表中插入新数据,可以插入成功。
(12.6 习题)
(一)填空题
1.事务的ACID特性包括(原子性)、(一致性)、(隔离性)、(持久性)。
2.在设置事务隔离层时,需要使用关键字(SET TRANSACTION)。
3.在众多的事务控制语句中,用来撤销事务操作的语句是(ROLLBACK),用来持久化事务对数据库操作的语句是(COMMIT)。
4.对表执行INSERT命令时系统自动加(RX)锁,执行CREATE命令时系统自动加(S)锁,执行ALTER命令时系统自动加(X)锁。
(二)简答题
1.哪些情况发生后事务将终止?
答:Oracle中的事务终止会发生在:
(1)用户使用COMMIT命令显示提交事务。
(2)用户使用ROLLBACK命令回滚整个事务。
(3)用户执行了一条DDL语句。(如create\drop\alter)
(4) 用户正常断开了与Oracle的连接,这时用户当前的事务将被自动提交。
(5)用户进程意外被终止,这时用户当前的事务被回滚。
(6)用户关闭SQL*PLUS会话时,默认使用ROLLBACK回滚事务。
2.数据库的并发操作会带来哪些问题?
答:数据库的并发操作会带来以下问题:
(1)丢失更新。(2)错读(脏读)。
(3)不一致的分析(不可重复读)。
(4)幻读。
3.要建立一个名为savepint1的保存点,应使用哪个语句?
答:应使用语句:SAVEPOINT savepint1;