- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第三章上机课锁和表分区
老二牛车教育
《Oracle 数据库应用 》上机课
上机课锁和表分区
目标:
能够理解锁定的概念
能够测试行级锁
能够测试共享锁和行共享锁
能够创建表分区
第一部分 指导
本阶段重点介绍如何测试行级锁、共享锁和行共享锁,以及创建各种类型分区表的方法
阶段一:锁的概念
需求说明:
GITM 公司的雇员管理系统需要多个部门的用户经常进行更新,当更新操作比较频繁且多
个部门同时更新雇员表时,用户会感到系统反应变慢,甚至出现等待几秒后才能完成修改
的情况。用户向技术人员反应这一情况,并希望得到合理的解释和解决方案。
实现思路:
上述情况可能是数据库的锁定机制引起的。锁是一种机制,用于防止同时访问相同资源的
用户之间出现破坏性的交互操作。资源可以是整个表或表中的特定行。当多个用户同时更
新相同的数据时,数据库提供锁定机制保证同一数据在同一时间只能有一个用户在更新,
其他用户必须等待前面的更新完成,从而保证数据的一致性。因此,锁提供了高度的数据
并发性。
可以获取两种不同级别的锁:行级锁(用于特定的行)和表级锁(用于整个表)。
通过测试和分析锁定的机制,根据实际应用的情况寻找合适的解决方案。
阶段二:行级锁
需求说明:
在什么情况下会出现行级锁?
实现思路:
在使用 INSERT、UPDATE、DELETE 和 SELECT···FOR UPDATE 等语句时,Oracle 会自动
应用行级锁定。SELECT···FOR UPDATE 语句允许用户每次选择多行记录以进行更新,这
些记录会被锁定,且只能由发起查询的用户进行编辑。只有在回滚或提交该事务后,锁定才
会释放,其他用户才可以编辑这些记录。
参考步骤:
通过模拟两个用户同时更新表的相同行来测试 SELECT···FOR UPDATE 语句引起的行级锁,
本例使用自己的用户名用户和 SCOTT 用户登录数据库进行测试。
1 以用户名用户身份登录 SQL Plus,授予用户 SCOTT 更新 employee 表的权限。
SQLGRANT ALL ON employee TO SCOTT ;
2 用户名用户执行下列命令。
SQLSELECT * FROM employee WHERE empno = ?E006?
老二牛车教育
《Oracle 数据库应用 》上机课
FOR UPDATE;
此时,employee 表的“E006”行会被锁定,用户名用户就可以更新该表。
SQL UPDATE employee SET designation = ‘Accountant ’
WHERE empno = ?E006?
“E006”行更新成功。
3 打开 SQL Plus 的另一个实例,以 SCOTT 用户身份登录并更新 employee 表的 E006 行。
SQL UPDATE 用户名.employee SET designation = ‘Accountant ’
WHERE empno = ?E006?
此命令无法立即执行,SQL Plus 停止响应,等待用户名用户提交事务。
4 切换到第一个 SQL *Plus,ACCP 用户执行以下命令提交事务。
SQL COMMIT;
此时,锁被释放,然后用户 SCOTT 的更新命令才会成功执行。如果用户 SCOTT 在步骤(3)执
行的是更新“E002”行的命令,那么此操作将成功执行,因为“E002”行未被锁定。
阶段三:测试共享锁
需求说明:
GITM 公司人力资源部的职员每个周末都要对 employee 表进行统计以形成周报表。因为统计
报表需要较长的时间,为了保证报表的一致性,不希望在提交的时间段里有记录的更新。使
用什么办法能达到此效果?
实现思路:
表级锁保护表数据,在事务处理过程中,表级锁会限制对整个表的访问。共享锁锁定表,仅
允许其他用户查询表中的行,但不允许插入、更新或删除行。多个用户可以同时在同一表中
放置共享锁,即允许资源共享,因此得名“共享锁”。在此问题中,如果人力资源部的职员读
取 employee 表进行统计,而与此同时,另一用户要求更新该表,那么,要通过使用共享锁使
其他用户无法更新该表。在统计完成之后释放锁定,其他用户就可以进行更新了。
参考步骤:
(1)启动 SQL *Plus,以用户名用户身份登录,执行下列命令来锁定 employee 表。
SQL LOCK TABLE employee IN SHARE MODE;
此命令将以共享模式来锁定 employee 表。
(2)打开 SQL *Plus 的另一个实例,以 SCOTT 用户身份登录,执行下列语句。
SQLDELETE FROM 用户名.employee WHERE empno = ?E005?;
此时 SQL *Plus 停止响应删除操作等待释放锁。
文档评论(0)