- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
CH锁和表分区
锁
数据库用来控制共享资源并发访问的机制。
用于保护正在被修改的数据
直到提交或回滚了事务之后,其他用户才可以更新数据
锁定的优点
一致性 - 一次只允许一个用户修改数据
完整性 - 为所有用户提供正确的数据。
如果一个用户进行了修改并保存,所做的修改将反映给所有用户
并行性 -允许多个用户访问同一数据
锁的分类:
行级锁
表级锁
行级锁
对正在被修改的行进行锁定。其他用户可以访问除被锁定的行以外的行
在使用以下语句时,Oracle会自动应用行级锁:
INSERT
UPDATE
DELETE
SELECT … FOR UPDATE
--用户scott操作:
update emp set sal=9000 where empno=7369; --行级锁自动应用update emp set sal=8000 where empno=7369; --将等待scott释放锁
--用户scott操作:
rollback; --用户scott 提交或回滚释放锁 用户system将可以提交此事务
SELECT … FOR UPDATE语句允许用户一次锁定多条记录进行更新
只能由发起查询的用户编辑
select .... for update [of column_list] [wait n | nowait];
of column_list 子句用于指定即将更新的列,即锁定行上的特定列。? 子句指定等待其他用户释放锁的秒数,防止无限期的等待。select * from emp where empno=7369 for update ;
update emp set sal=7000 where empno=7369;
rollback;
--用户system
select * from scott.emp where empno=7369 for update wait 5 ;
update scott.emp set sal=6000 where empno=7369; --使用wait防止无期限等待
commit;
使用COMMIT或ROLLBACK语句释放锁
表级锁
语法:
lock table 表名 in 锁模式名 mode [nowait]
表级锁模式:
行共享 (row share )
允许其他用户更新其他行,不允许排他
行排他(row exclusive)
允许其他用户更新其他行只允许其他用户同时加共享锁或者行共享锁其他用户禁止更新任何行,禁止其他用户同时加任何锁lock table emp in share mode nowait; --加共享锁
rollback; --释放锁
--用户system:
update scott.emp set sal=7000 where empno=7369; --不允许更新 等待
commit; --释放锁
lock table scott.emp in exclusive mode nowait;
--由于scott已经在emp表上加share锁不允许其他用户加排他锁
lock table scott.emp in share mode; --可以加共享锁
rollback; --释放锁
使用COMMIT或ROLLBACK语句释放锁
死锁
使用锁机制的缺点之一可能出现死锁
当两个事务相互等待对方释放资源时,就会形成死锁
Oracle会自动检测死锁,并通过结束其中的一个事务来解决死锁
示例:
--创建演示用表
create table lock_one as select 100 num1 from dual;
create table lock_two as select 1 num2 from dual;
update lock_one set num1=num1+1; --scott更新lock_one
update scott.lock_two set num2=num2+1; --system更新lock_two
update lock_two set num2=num2+1; --scott更新lock_two 等待system释放锁 不是死锁 只是阻塞
update lock_one set num1=num1+1;
--system更新lock_one 出现死锁 oracle会检测到并自动终止其中一个事务
表分区
当一个表包含大量数据时,查询特定记录时往往需要搜索整个表,从而耗费系统资源和时间,为提高数据库的性能,Oralce提供了表分区的技
文档评论(0)