ORACLE锁的管理

原创 2004年08月13日 13:47:00

最近,遇到了一个系统故障。现象是客户端的机器无故发生死机现象。

查找了相关资料,觉得很可能是oracle锁的问题。先把相关的知识补习一下。

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进程并不能彻底清除锁的问题。

 

一个关于#include的问题

一个关于#include的问题 赵湘宁 问题:    我试图将一个头文件包含在工程的资源文件中。为此在.rc文件中添加了如下一行代码:#include "MyFile.h"虽然运行没有问题,但是每次在...
  • ghj1976
  • ghj1976
  • 2001-05-03 12:04:00
  • 1696

Oracle和DB2锁的 比较

 摘自牛新庄的博客。 1 引言 在关系数据库(DB2,Oracle,Sybase,Informix和SQL Server)最小的恢复和交易单位为一个事务(Transactions),事务具有...
  • suliqiang
  • suliqiang
  • 2015-08-18 14:20:13
  • 753

db2 与 Oracle 的锁的区别和比较

原来一直在做 Oracle ,“读不阻止写,写不阻止读”的想法扎根很深,但是在用 DB2 的过程中总感觉 DB2 的锁的实现、使用以及管理都麻烦些。1.Oracle通过具有意向锁的多粒度封锁机制进行并...
  • tcspace
  • tcspace
  • 2007-11-03 16:37:00
  • 665

DB2和Oracle的并发控制(锁)比较

转载于:http://soft.chinabyte.com/270/7513770.shtml 1 引言  在关系数据库(DB2,Oracle,Sybase,Informix和SQL Server)最...
  • zgmzyr
  • zgmzyr
  • 2010-09-17 23:15:00
  • 451

浅谈Oracle锁机制表锁行锁乐观锁悲观锁

  Oracle的锁机制主要分为行锁和表锁,行锁即锁定表中的某行数据,表锁锁定表中所有数据。锁定的数据不能插入,更新,删除,只能查询,语法 for update。锁的周期为一次数据提交,一次数据提交中...
  • lishengko
  • lishengko
  • 2017-02-19 16:04:15
  • 3702

oracle系统默认用户名以及如何解决scott提示被锁的方法

安装oracle时,若没有为下列用户重设密码,则其默认密码如下: 用户名/密码 登录身份 说明 sys/change_on_install ...
  • riyunzhu
  • riyunzhu
  • 2012-07-27 09:13:38
  • 2096

【Oracle学习】之 事务(Transaction)与锁

Q:创建空表后再插入记录,再回滚,记录没了,而表还存在? A:看(下文)事务提交COMMIT 一、事务概念  定义:事务是一些数据库操作的集合。特性:  ①原子性(Atomicity):事务是数...
  • fanfan4569
  • fanfan4569
  • 2017-04-18 16:42:28
  • 1246

Oracle数据库中的锁机制

数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。 在数据库中有...
  • liuyiy
  • liuyiy
  • 2014-05-04 22:09:11
  • 9364

详解ORACLE锁分类

看了网上一些资料,发现对Oracle中的锁有多种分类方法,从各个不同的角度对锁进行分析。预备知识: DDL(DATABASE DEFINITION LANGUAGE):数据库定义语言,如crea...
  • Hunterdiary
  • Hunterdiary
  • 2006-12-25 16:08:00
  • 3923

ORACLE六大锁模式

ORACLE六大锁模式级别越高影响越多   ORACLE里锁有以下几种模式: 0:none 1:null 空 2:Row-S 行共享(RS):共享表锁,sub share 3:Row-...
  • holandstone
  • holandstone
  • 2016-09-02 11:00:43
  • 1826
收藏助手
不良信息举报
您举报文章:ORACLE锁的管理
举报原因:
原因补充:

(最多只允许输入30个字)