ORA-00054:资源正忙,指定以nowait方式获取资源

在PL/SQL中执行插入数据,然后去DELETE表中的所有数据,当执行完DELETE之后再去从新插入数据就会卡死,-0.0-我还以为是工具的原因关掉PL/SQL好几次了,打开还是有这个错误存在,问了一下旁边的大牛,让我去问度娘.. ,感谢度娘找到了这个问题是我的操作没有提交事务导致锁死 。
文章参考ORA-00054


  • Oracle数据库的锁类型
    根据保护的对象不同,Oracle数据库锁可以分为一下几大类:DML锁(data locks,数据锁),用于保护数据的完整性,DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等结构定义,内部所闩(internal locks and latches),保护数据库的内部结构。

DML锁的目的在于保护并发现情况下的数据完整性,在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中的TM锁成为表级锁,TX锁称为事务所或行级锁。

当Oracle执行CML语句是,系统自动在索要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再执行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括SS、SX、S、X等多种模式,在数据库中用()-6来表示。不同的SQL操作产生不同类型的TM锁。

在数据行上只有X锁(排他锁)。在Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在标的同一条记录上执行DML语句时,第一个会话在该条记录上加锁,其他的会话处在等待状态。当一个会话提交后,TX锁被释放,其他会话才可以加锁。

当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60错误。这些现象都会对实际应用产生极大地危害,如长时间未响应,大量事务失败等。

  • 悲观封锁和乐观封锁

    1. 悲观封锁
      锁在用户修改之前就发挥作用:

Select column_name(s) for update(nowait)

Select column_name(s) from table1 for update

用户发出这条命令之后,Oracle将会对返回集中的数据建立进行级封锁,以防止其他用户的修改。
如果此时其他用户对上面返回结果集的数据进行DML或DDL操作都会返回一个错误信息或发生阻塞。
1:对返回结构集进行update或delete操作发生阻塞。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值