实验13事务并发控制与安全.docx
- 文档编号:23213835
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:16
- 大小:226.39KB
实验13事务并发控制与安全.docx
《实验13事务并发控制与安全.docx》由会员分享,可在线阅读,更多相关《实验13事务并发控制与安全.docx(16页珍藏版)》请在冰豆网上搜索。
实验13事务并发控制与安全
实验13 事务、并发控制与安全
姓名:
计算机科学与技术
学号:
专业:
班级:
同组人:
无
实验日期:
【实验目的与要求】
⏹提交事务、回滚事务
⏹发出保存点
⏹事务锁机制的理解
【实验内容与步骤】
13.1.事务处理初步
无论何时发出命令,都不会对数据库作直接更改。
对于DML语句来讲必须明确地发出提交语句来保存更改;对于DDL,系统会自动提交。
实验13-1:
事务提交的实现。
请按照下列给出的步骤完成实验,理解事务处理过程。
(1)打开一个以上的SQLplus的实例,即启动SQLplus多个会话,并连接到上次使用的相同用户模式(即以相同用户名和口令登录)。
如:
开启两个同时处于活动状态的SQLplus会话,如图13-1所示。
图13-1 开启多个会话
(2)如图13-1中所示,在“dept”表中插入一条新记录。
图13-2 插入与查询数据
(2)在第一个会话窗口中发出一个选择语句,检验记录的插入。
请给出查询结果:
(4)另一个会话窗口对同一dept表发出同一查询语句。
请给出查询结果:
思考:
比较两个查询语句运行结果,思考为什么会有这样的结果。
(5)在第一个会话窗口提交修改。
(6)完成提交后再在两个窗口各自对dept执行查询操作,比较查询结果,看是否相同?
实验13-2:
执行下面的步骤理解提交的概念。
(1)单击第一个SQL实例,如图所示,插入一项新记录。
(2)单击第二个会话,在此插入同一项记录。
观察并比较运行结果,特别关注第二个会话的运行结果。
(3)在第一个会话中提交数据(Commit),观察第二个会话中的反应状态。
请给出运行结果:
结论:
由于记录是插入到第一个会话中的,又试图把相同的记录插入第二个会话中,并且由于deptno是主键,因此第二个会话不允许用户插入记录;而且在第一个会话发出提交语句或回滚语句(以后讨论)之前,挂起第二个会话。
实验13-3:
遵循下面给出的步骤,我们将理解如何保存记录整个过程背后的逻辑。
(1)单击任务栏上SQL的第一个会话。
将雇员的薪水更新为Rs.4000。
请给出运行结果:
(2)单击任务栏上的第二个SQL会话,试着更新相同记录的值。
请给出运行结果:
结论:
第二个会话处于挂起状态,因为无论何时更新一个记录,在用户提交或回滚它之前,该记录是锁定的。
因此,如果不发出提交或回滚语句,第二个会话一直是锁定的,直到解锁。
注意:
DDL语句是自动提交的,所以没有必要使用任何提交语句来保存DDL语句所作的更改。
13.2.撤消更改
我们已用提交语句保存更改,下面看看如何使用回滚语句来达到我们的目的。
回滚语句用于撤消未提交的更改。
实验13-4:
执行下面给出的步骤,用回滚语句进行操作。
(1)如图中所示,在“dept”表中插入一条新记录。
(2)发出一个选择语句查看如图4中所示的新记录,可以看到新记录。
(3)发出一个如图4中所示的回滚语句。
(4)给出一个选择语句查看记录。
请给出运行结果:
思考:
比较两次查询语句执行的结果,理解回滚操作。
注意:
提交更改之后,就不能执行回滚语句。
13.3.插入保存点
保存点只是在事务中插入的书签。
这些书签用于标注事务,并配合回滚语句工作。
由于回滚撤消整个任务,与保存点一起使用的回滚可用来撤消事务的某个部分。
实验13-5:
通过下面的操作步骤了解如何使用保存点:
(1)删除deptno=70和80的记录,发出一个如图5中所示的保存点。
(2)把deptno为40的位置(Loc)更新为“SANDIEGO”。
(3)给出一个如下所示的命令来只撤消更新的记录。
(4)查询dept表中数据,给出查询结果,注意观查表中是否还有deptno=70和80的记得和deptno=40的记录是否被更新。
请给出运行结果:
13.4.事务处理综合练习
(1)实验准备:
根据现有表emp生成测试用表
(2)按下表所示步骤完成实验,根据运行结果完成表格最后一栏,理解事务处理。
打开三个SQLPlus窗口完成实验
要点:
在第一个SQLPlus窗口中设置SETTRANSACTIONREADONLY
时间
会话1
会话2
会话3
给出各会话结果
T1
settransactionreadonly;
T2
selectcount(*)fromemp_t;
selectcount(*)fromemp_t;
会话1:
会话2:
T3
deletefromemp_twhererownum<=5;
会话3:
T4
selectcount(*)fromemp_t;
selectcount(*)fromemp_t;
会话1:
会话2:
T5
commit;
T6
selectcount(*)fromemp_t;
selectcount(*)fromemp_t;
会话1:
会话2:
T7
insertintoemp_t
select*fromemp_t;
会话3:
T8
commit
T9
selectcount(*)fromemp_t;
selectcount(*)fromemp_t;
会话1:
会话2:
T10
commit
T11
selectcount(*)fromemp_t;
会话1:
给出各会话结果(依时间排列):
13.5.事务处理的ACID属性
13.5.1事务原子性
实验13-6:
语句级原子性
(1)完成以下语句的执行
(2)依次执行以下语句:
setserveroutputon;
insertintotpvalues
(1);
insertintotpvalues(-1);
观查运行结果:
(3)查询t2表中cnt字段的值
请给出执行结果:
思考:
为什么会有这样的结果?
13.5.2事务一致性
实验13-7:
按以过程完成程序,理解事务的一致性。
(1)完成以下语句的执行
(2)依次执行以下语句:
请给出执行结果:
13.6.事务的并发控制
实验13-8:
引发死锁
锁定是用来控制共享资源并发访问的机制死锁就是两个会话都进入了彼此等待对方的状态。
请按下列步聚完成实验操作,理解Oracel锁机制。
(1)在会话1中,执行如下的操作:
SQL>createtablea
2as
3select1xfromdual;
表已创建。
SQL>createtableb
2as
3select1xfromdual;
表已创建。
SQL>updateasetx=x+1;
已更新1行。
(2)在会话2中,执行如下的操作:
SQL>updatebsetx=x+1;
已更新1行。
现在在会话2中执行语句:
SQL>updateasetx=x+1;
请给出执行结果:
因为第一个会话已经将这个行锁定,所以将会立即阻塞(SQL提示符不能返回)。
然而,这并不是死锁,这只是阻塞。
现在还没有死锁,因为第一个会话还有机会进行提交或者回滚,这是第二个会话将继续执行。
只是处于等待状态。
(3)在会话1中,更新B表,这将导致死锁。
SQL>updatebsetx=x+1;
会话1处于执行状态,但是没有SQL提示符的返回,也没有处理结果
(4)在会话2中,可以看到Oracle检测到了死锁。
SQL>updateasetx=x+1;
请给出执行结果:
(5)查找Oracle的追踪文件:
c:
\oracle\product\10.1.0\admin\testdb\udump\testdb_ora_XXXX.trc,其中XXXX为一编号,实验时请根据文件创建和修改时间选择最新的。
会发现类似如下记录信息:
该文件中记录了发生死锁的系统的一系列的信息。
13.7创建用户
创建用户就是在数据库中增加一个用户帐户,用户可以使用该帐户访问数据库。
可以使用createuser创建账户,语法形式如下:
createuseruser_name
identifiedbypassword
其中:
user_name指定将要创建的数据库用户的名称
password指定该数据库用户的口令。
在创建用户时,创建者应该具有createuser系统权限。
实验13-9:
创建用户
以scott/tiger身份创建一个用户Hillary,其口令是window.
请给出执行结果截图:
实验练习:
创建用户
以scott/tiger身份创建一个用户DEMO,其口令是DEMO.
请给出执行结果截图:
创建用户之后,如果没有为该用户授予相应的连接数据库的权限,该用户依然不能连接到数据库中。
需要为用户授予createsession的权限。
语法如下:
grantcreatesessiontouser_name
为了保护数据库的安全,用户口令应该经常修改。
可以使用两种方式修改用户口令。
第一种方式是使用alteruser语句修改用户的口令.
语法形式如下:
alteruseruser_nam
identifiedbynew_password
第二种方式是使用password命令。
前一种既可以修改当前用户的口令,也可以修改其他用户的口令;后一种只能用来修改当前用户的口令。
13.8授予权限
注意:
SCOTT登录的密码是TIGER,而DEMO登录的密码为前面创建用户之密码。
13.8.1授予特定的权限
实验13-10:
授予特定用户特定的权限
要将emp表上的SELECT权限授予DEMO,请给出如图所示的命令。
请给出执行结果截图:
实验13-11:
授予特定用户特定的权限
(1)连接与查询:
请执行如下图中所示的步骤
在下面的命令中,首先连接到DEMO登录,然后发出查询语句,在那里,在指定表名称时需把模式名放在了表名称的前面。
请给出执行结果截图:
(2)试图对表执行如图下图中所示的操作,理解权限管理。
请给出执行结果截图:
思考:
为什么第
(2)中的语句没能执行成功?
13.8.2授予所有权限
在上面的实验中,已经了解如何授予特定权限。
实验13-12:
向其他用户授予所有权限
下面是一个可以向其他用户授予所有权限的实验,执行如图中所示的步骤,向其他用户授予所有权限。
实验中,首先连接到SCOTT,然后,我们向DEMO授予了所有权限。
授予权限后,连接到DEMO登录。
首先发出从授予表中查看所有记录的选择语句。
(1)连接与查询
请给出执行结果截图:
(2)修改表中数据
完成查询后,更新记录以更改表中的值,如下图:
请给出执行结果截图:
(2)删除表
在sqlplus中执行如下命令:
droptablescott.dept
请给出执行结果截图:
小结:
授予所有权限后,被授权人就可执行所有DML任务;被授权人不能删除表,即使授权人给予其ALL权限。
13.8.3理解WITHGRANTOPTION
到现在为止,明白了对象的所有者(授权人)向另一个用户(被授权人)授予权限。
而且,被授权人根据其所拥有的权限利用对象。
但是,有时被授权人本身想向第三个用户授予授权人表。
假如主授权人利用WITHGRANTOPTION授予了该表,正常情况下,被授权人无法这样做。
实验13-13:
下面看看一个使用WITHGRANTOPTION的示例。
(1)准备工作
a.使用create…as…命令创建表ret_emp;
b.创建用户ani,口令为ani,并授予连接权限;
请给出执行结果截图:
(2)执行如图中所示的步骤
DEMO将Scott的表授予用户ANI之后,ANI访问该表的方式显示在下图之中。
执行如下步骤,了解整个情况。
现在,由于SCOTT已授予DEMO所有权限。
DENO在向ANI授予表时可授予任何权限。
但是,假定SCOTT只授予对表的选择权限,则DEMO就只能向ANI授予选择权限。
接下来的步骤是,DEMO向ANI授予权限,DEMO只授予对表的插入权限。
因此,当ANI试图使用选择语句时,他就会收到出错信息。
但是,他可以正常插入值。
13.9撤消权限
我们使用GRANT命令向用户授予权限。
而REVOKE用来从用户那里撤消权限。
实验13-14:
执行如下图中所示的步骤,撤消DEMO对ret_emp表的权限。
注意:
当SCOTT撤回DEMO的权限后,DEMO授予ANI的权限也自动撤消。
您也可以一次只从被授权人撤回某项特定权限。
实验练习:
以DEMO用户连接数据库,试着对表ret_emp进行查询、更新和删除操作,给出实验结果。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验13 事务并发控制与安全 实验 13 事务 并发 控制 安全