实验9 事务、并发控制与安全

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验9事务、并发控制与安全

姓名:学号:

专业:班级:

同组人:无实验日期:2013/7/23

【实验目的与要求】

⏹提交事务、回滚事务

⏹发出保存点

⏹事务锁机制的理解

【实验内容与步骤】

9.1.事务处理初步

无论何时发出命令,都不会对数据库作直接更改。对于DML语句来讲必须明确地发出提交语句来保存更改;对于DDL,系统会自动提交。

实验9-1:事务提交的实现。请按照下列给出的步骤完成实验,理解事务处理过程。

(1) 打开一个以上的SQL plus 的实例,即启动SQL plus 多个会话,并连接到

上次使用的相同用户模式(即以相同用户名和口令登录)。如:开启两个同时处于活动状态的SQL plus 会话,如图9-1 所示。

会话 1 会话 2

图9-1开启多个会话

(2) 如图9-1 中所示,在“dept”表中插入一条新记录。

图9-2插入与查询数据

(2) 在第一个会话窗口中发出一个选择语句,检验记录的插入。

请给出查询结果:

(4)另一个会话窗口对同一dept 表发出同一查询语句。

请给出查询结果:

思考:比较两个查询语句运行结果,思考为什么会有这样的结果。(5)在第一个会话窗口提交修改。

(6)完成提交后再在两个窗口各自对dept执行查询操作,比较查询结果,看是否相同?

实验9-2:执行下面的步骤理解提交的概念。

(1)单击第一个SQL 实例,如图所示,插入一项新记录。

(2)单击第二个会话,在此插入同一项记录。

观察并比较运行结果,特别关注第二个会话的运行结果。

(3)在第一个会话中提交数据(Commit),观察第二个会话中的反应状态。

请给出运行结果:

结论:由于记录是插入到第一个会话中的,又试图把相同的记录插入第二个会话中,并且由于deptno 是主键,因此第二个会话不允许用户插入记录;而且在第一个会话发出提交语句或回滚语句(以后讨论)之前,挂起第二个会话。

实验9-3:遵循下面给出的步骤,我们将理解如何保存记录整个过程背后的逻辑。

(1)单击任务栏上SQL 的第一个会话。将雇员的薪水更新为Rs.4000。

请给出运行结果:

请给出运行结果:

结论:第二个会话处于挂起状态,因为无论何时更新一个记录,在用户提交或回滚它之前,该记录是锁定的。因此,如果不发出提交或回滚语句,第二个会话一直是锁定的,直到解锁。

注意:DDL 语句是自动提交的,所以没有必要使用任何提交语句来保存DDL 语

句所作的更改。

9.2.撤消更改

我们已用提交语句保存更改,下面看看如何使用回滚语句来达到我们的目的。回

滚语句用于撤消未提交的更改。

实验9-4:执行下面给出的步骤,用回滚语句进行操作。

(1)如图中所示,在“dept”表中插入一条新记录。

(2)发出一个选择语句查看如图4 中所示的新记录,可以看到新记录。

(3)发出一个如图 4 中所示的回滚语句。

(4)给出一个选择语句查看记录。

请给出运行结果:

思考:比较两次查询语句执行的结果,理解回滚操作。

注意:提交更改之后,就不能执行回滚语句。

9.3.插入保存点

保存点只是在事务中插入的书签。这些书签用于标注事务,并配合回滚语句工作。由于回滚撤消整个任务,与保存点一起使用的回滚可用来撤消事务的某个部分。

实验9-5:通过下面的操作步骤了解如何使用保存点:

(1)删除deptno=70 和80 的记录,发出一个如图 5 中所示的保存点。

(2)把deptno为40 的位置(Loc)更新为“SAN DIEGO”。

(3)给出一个如下所示的命令来只撤消更新的记录。

(4)查询dept表中数据,给出查询结果,注意观查表中是否还有deptno=70 和80的记得和deptno=40的记录是否被更新。

请给出运行结果:

9.4.事务处理综合练习

(1)实验准备:根据现有表emp生成测试用表

(2)按下表所示步骤完成实验,根据运行结果完成表格最后一栏,理解事务处理。

打开三个SQL Plus窗口完成实验

要点:在第一个SQL Plus窗口中设置SET TRANSACTION READ ONLY 时

会话1 会话2 会话3 给出各会话结果

T1 set transaction read only;

T 2 select

count(*)

from

emp_t;

select

count(*)

from

emp_t;

会话1:

会话2:

T3 delete from

emp_t where

rownum<=5; 会话3:

T4 select

count(*)

from

emp_t;

select

count(*)

from

emp_t;

会话1:

会话2:

T5 commit;

T6 select

count(*)

from

emp_t;

select

count(*)

from

emp_t;

会话1:

会话2:

T7 insert into

emp_t

select * from

emp_t;

会话3

T8 commit

T9 select

count(*)

from

emp_t;

select

count(*)

from

emp_t;

会话1:

会话2:

相关文档
最新文档