欢迎投稿

今日深度:

解决ora-00054 Oracle锁表问题,ora-00054oracle

解决ora-00054 Oracle锁表问题,ora-00054oracle


1、运行sql: select session_id from v$locked_object;   查出锁表的session,可能很多,正常是没有的

2、SELECT sid, serial#, username, osuser FROM v$session where sid = 162;   将162换成你查出来的session_id

3、kill掉session

      ALTER SYSTEM KILL SESSION '162,4294';   4294为第二步查出来的serial#,

      


整个过程如图:




ora-00054: 资源正忙, 但指定以 nowait 方式获取资源怎解决

ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效

解决方法如下:
=========================================================
SQL> select session_id from v$locked_object;
SESSION_ID
----------
56
SQL> SELECT sid, serial#, username, osuser FROM v$session where sid = 142;
SID SERIAL# USERNAME OSUSER
---------- ---------- ------------------------------ ------------------------------
56 2088 ghb fy
SQL> ALTER SYSTEM KILL SESSION '56,2088';
System altered
执行完上述命令后,提示会话断开。重新连接数据库,然后执行truncate操作,成功!

以下是原理部分
==============

Oracle数据库的锁类型
根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护数据库的内部结构。
DML锁的目的在于保证并发情况下的数据完整性,。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。
当Oracle 执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X 等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。
在数据行上只有X锁(排他锁)。在 Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。
当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。
悲观封锁和乐观封锁
一、悲观封锁
锁在用户修改之前就发挥作用:
Select ..for update(nowait)
Select * from tab1 for update
用户发出这条命令之后,oracle将会对返回集中的数据建立行级封锁,以防止其他用户的修改。
如果此时其他用户对上面返回结果集的数据进行dml或ddl操作都会返回一个错误信息或发生阻塞。
1:对返回结果集进行update或dele......余下全文>>
 

oracle 锁表问题 我在后台循环执行了一些delete操作 怎表就锁住了 该怎解锁?

什么客户端,Delete后提交了吗
明确再调用commit看如何
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/2768.html NewsArticle 解决ora-00054 Oracle锁表问题,ora-00054oracle 1、运行sql:select session_id from v$locked_object; 查出锁表的session,可能很多,正常是没有的 2、SELECT sid, serial#, username, osuser FROM v$session where sid = 162...
相关文章
    暂无相关文章
评论暂时关闭