脚本宝典收集整理的这篇文章主要介绍了ORA-00054: 资源正忙,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
一、悲观封锁锁在用户修改之前就发挥作用:Select ..for update(nowait)Select * From tab1 for update用户发出这条命令之后,oracle将会对返回集中的数据建立行级封锁,以防止其他用户的修改。如果此时其他用户对上面返回结果集的数据进行dML或ddl操作都会返回一个错误信息或发生阻塞。1:对返回结果集进行update或delete操作会发生阻塞。2:对该表进行ddl操作将会报: Ora-00054:resource busy and acquire wITh nowait sPEcified.
原因分析此时Oracle已经对返回的结果集上加了排它的行级锁,所有其他对这些数据进行的修改或删除操作都必须等待这个锁的释放,产生的外在现象就是其他的操作将发生阻塞,这个这个操作commit或rollback.同样这个查询的事务将会对该表加表级锁,不允许对该表的任何ddl操作,否则将会报出 ora-00054错误::resource busy and acquire with nowait specified.
二、乐观封锁乐观的认为数据在select出来到update进取并提交的这段时间数据不会被更改。这里面有一种潜在的危险就是由于被选出的结果集并没有被锁定,是存在一种可能被其他用户更改的可能。因此Oracle仍然建议是用悲观封锁,因为这样会更安全。
Oracle的TM锁类型
1.关于V$lock表和相关视图的说明 TM - DML enqueue TX - Transaction enqueue UL - User supplied --我们主要关注TX和TM两种类型的锁 --UL锁用户自己定义的,一般很少会定义,基本不用关注 --其它均为系统锁,会很快自动释放,不用关注 ---当lock type 为TM时,id1为DML-locked object的object_id ---当lock type 为TX时,id1为usn+slot,而id2为seq。 --当lock type为其它时,不用关注---根据usn等查询SQL(不太准)
select /*+ rule*/c.SQL_TEXT from v$transaction a, v$session b, v$sql c where a.XIDUSN = &XIDUSN and a.XIDSLOT = &XIDSLOT and a.XIDSQN = &XIDSQN and a.ADDR = b.TADDR and b.SQL_ADDRESS = c.ADDRESS and b.SQL_HASH_VALUE = c.HASH_VALUE;
以上是脚本宝典为你收集整理的ORA-00054: 资源正忙全部内容,希望文章能够帮你解决ORA-00054: 资源正忙所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。