1.ORACLE里锁有以下几种模式:
0:none
1:null 空
2:Row-S 行共享(RS):共享表锁,sub share
3:Row-X 行独占(RX):用于行的修改,sub exclusive
4:Share 共享锁(S):阻止其他DML操作,share
5:S/Row-X 共享行独占(SRX):阻止其他事务操作,share/sub exclusive
6:exclusive 独占(X):独立访问使用,exclusive
数字越大锁级别越高, 影响的操作越多。
1级锁有:Select,有时会在v$locked_object出现。
2级锁有:Select for update,Lock For Update,Lock Row Share
select for update当对话使用for update子串打开一个游标时,所有返回集中的数据行都将处于行级(Row-X)独占式锁定,其他对象只能查询这些数据行,不能进行update、delete或select for update操作。
3级锁有:Insert, Update, Delete, Lock Row Exclusive
没有commit之前插入同样的一条记录会没有反应, 因为后一个3的锁会一直等待上一个3的锁, 我们必须释放掉上一个才能继续工作。
4级锁有:Create Index, Lock Share
locked_mode为2,3,4不影响DML(insert,delete,update,select)操作, 但DDL(alter,drop等)操作会提示ora-00054错误。
00054, 00000, "resource busy and acquire with NOWAIT specified"
// *Cause: Resource interested is busy.
// *Action: Retry if necessary.
5级锁有:Lock Share Row Exclusive
具体来讲有主外键约束时update / delete ... ; 可能会产生4,5的锁。
6级锁有:Alter table, Drop table, Drop Index, Truncate table, Lock Exclusive
以DBA角色, 查看当前数据库里锁的情况可以用如下SQL语句:
col owner for a12
col object_name for a16
select b.owner,b.object_name,l.session_id,l.locked_mode
from v$locked_object l, dba_objects b
where b.object_id=l.object_id
/
select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time
/
如果有长期出现的一列,可能是没有释放的锁。我们可以用下面SQL语句杀掉长期没有释放非正常的锁:
alter system kill session 'sid,serial#';
如果出现了锁的问题, 某个DML操作可能等待很久没有反应。
当你采用的是直接连接数据库的方式,也不要用OS系统命令 $kill process_num 或者 $kill -9 process_num来终止用户连接,因为一个用户进程可能产生一个以上的锁, 杀OS进程并不能彻底清除锁的问题。
分享到:
相关推荐
### ORACLE应用中常见的傻瓜问题1000问(精选知识点解析) #### 知识点1:如何查看系统被锁的事务时间? 在Oracle数据库中,了解哪些...以上知识点涵盖了Oracle数据库中常见的操作和问题解决方法,希望对你有所帮助。
在 Oracle 中,当出现 ORA-00054 错误时,通常是由于资源忙碌,无法获取资源而导致的。在这种情况下,可以使用强制释放锁的命令来释放锁资源,解决问题。 一、什么是 ORA-00054 错误? ORA-00054 错误是 Oracle 中...
诊断死锁的方法主要包括使用Oracle的DBA视图如V$SESSION_WAIT和V$LOCKED_OBJECT,以及使用DBMS_XTRACE包进行死锁跟踪。在描述中提到的博文链接中,可能包含了通过这些视图分析死锁问题的实例。"表死锁反馈.doc"文件...
通过上述步骤和命令,可以处理和解决Oracle数据库中的ORA-00031错误。重要的是,任何强制终止进程的操作都应在充分理解可能的后果的情况下谨慎执行,并且在执行此类操作前应尽可能与数据库管理员或其他专业人员协商...
在删除表空间时可能会遇到问题,比如描述中提及的"ora-00054: resource busy and acquire with nowait specified"错误,这意味着有活动的事务或锁定阻止了表空间的删除。要解决这个问题,需要找出并结束那些占用资源...
Oracle数据库在处理并发事务时,可能会遇到`ORA-00054: resource busy and acquire with NOWAIT specified`错误,这通常表示一个会话正在尝试获取一个被其他事务占用的资源,而该请求又指定了不允许等待(NOWAIT)。...
当`locked_mode`为2、3或4时,虽然不会影响到DML操作(如插入、删除、更新和选择),但在执行DDL操作(如ALTER TABLE, DROP TABLE等)时,可能会遇到ORA-00054错误,表明存在排他性锁冲突。 #### 主外键约束与锁 ...
from v$locked_object t1,v$session t2,v$sqltext t3 where t1.session_id=t2.sid and t2.sql_address=t3.address order by t2.logon_time; ``` 解决 Oracle 杀死死锁进程的方法可以分为两步:首先,查找被锁定的表...
"oracle死锁表后处理" oracle死锁表后处理是指在oracle数据库中处理死锁表...oracle死锁表后处理是指在oracle数据库中处理死锁表的各种方法和技巧,旨在解决oracle数据库中出现的死锁问题,确保数据的一致性和安全性。
在日常操作中,数据库用户可能会遇到各种问题,其中“ORA-00054: resource busy and acquire with nowait specified”是一个常见的错误,它通常出现在并发操作环境下,比如当一个事务正在处理数据而其他事务尝试立即...
### 数据库锁表问题解决方法 #### 一、问题背景 在进行数据库操作时,比如对数据表进行插入(INSERT)、更新(UPDATE)或删除...通过上述方法,可以有效地解决ORA-00054错误,并提高数据库系统的稳定性和性能。
如果锁定模式为2、3或4,则会影响`DML`操作如`INSERT`、`DELETE`、`UPDATE`等,并可能导致ORA-00054错误:“资源繁忙且指定为NOWAIT”。 5. **更新和删除时的行排他锁**: - 在执行`UPDATE`或`DELETE`操作时,通常...
ora-00031:session marked for kill处理oracle中杀不掉的锁一些ORACLE中的进程被杀掉后,状态被置为”killed”,但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库。现在提供一种方法解决这种问题,那...
SELECT object_name, machine, s.sid, s.serial# FROM v$locked_object l, dba_objects o, v$session s WHERE l.object_id = o.object_id AND l.session_id = s.sid; ``` 2. **结束锁定会话:** 一旦找到锁定的...
在 ORACLE 数据库中,当我们尝试 kill 一个进程时,可能会出现状态被置为 "KILLED" 但是锁定的资源长时间不释放的情况,这会导致错误提示 ORA-00030: User session ID does not exist 或 ORA-00031: session marked ...
- 可通过查询 V$SESSION 视图中的 `MACHINE` 和 `TERMINAL` 字段实现: ```sql SELECT machine, terminal FROM V$SESSION; ``` #### 六、Oracle表与字段查询 10. **查询表结构的方法**: - 使用 `DESC table_...
- 使用 `SELECT * FROM v$locked_object;` 来查看当前被锁定的对象及其锁定状态。 #### 15. 以 ARCHIVELOG 方式运行 Oracle - 在 `init.ora` 文件中设置 `log_archive_start = true`。 - 重启数据库以应用此设置。 ...
锁定的会话无法正常关闭时,先查询`V$LOCKED_OBJECT`和`V$SESSION`找出被锁定的对象和会话信息,然后尝试`ALTER SYSTEM KILL SESSION 'SID,Serial#'`。如果资源仍不释放,可以在OS层面执行`kill`命令杀死对应的进程...