ORACLE lock

锁定类型
0:none 
1:null 空 
2:Row-S 行共享(RS):共享表锁 
3:Row-X 行专用(RX):用于行的修改 
4:Share 共享锁(S):阻止其他DML操作 
5:S/Row-X 共享行专用(SRX):阻止其他事务操作 
6:exclusive 专用(X):独立访问使用
数字越大锁级别越高, 影响的操作越多。
如果DML没有提交情况下,另一个session提交针对同一资源的DLL,系统报错。
如果DML没有提交情况下,另一个session提交针对同一资源的DML,第二个session会hang住,等待第一个session。
死锁:
系统会系统自动处理,处理方式提出形成死锁的人,错误是ORA-00060
如果经常出现死锁,可以查看是否有子父表,即是否有某个列是另一个表的外键。
(父表主键是子表的外键)可以考虑在子表的相关列上加索引。
命令行模式处理行级锁
查看锁:
select sid,lock_id from dba_locks where blocking_others='Blocking';
select blocking_session, sid, serial#, wait_class, seconds_in_wait from v$session where blocking_session is not NULL order by blocking_session;
blocking_session: occupied resource session id
sid: waiting session id
seconds_in_wait: wait for time

select sid from v$lock where type='TX';
block列>0:占用资源sid
block列=0:等待资源sid
SELECT * FROM V$SESSION WHERE BLOCKING_SESSION IS NOT NULL;
sid列:等待资源sid
blocking_session列:占用资源sid
oracle级处理:
杀掉占用资源的session
1. 查询sid和serial#
select sid, serial#
  from v$session
 where sid = (select blocking_session
                from v$session
               where blocking_session is not null)
2. 杀进程
alter system kill session 'sid, serial#' immediate;
 杀掉等待资源的session
1. 查询sid和serial#
select sid, serial# from v$session where blocking_session is not null;
2. 杀进程
alter system kill session 'sid, serial#' immediate;
系统级处理:
1. 查询系统pid
select s.sid, p.spid
  from v$session s, v$process p
 where s.paddr = p.addr
   and s.sid = 146
2. 杀进程
kill -9 pid
日常引发锁的情况:
1. 唯一约束;
2. select for update;
选择使用nowait参数直接查看是否已有人在操作;否则会处于等待状态。
例如:select * from t where id>10 for update nowait;
如果有人已在操作,系统自动提示:ORA-00054:资源正忙,但指定以NOWAIT方式获取资源。
3. 外键没有创建索引;
从表的外键创建索引的情况:
a. 主表上有频繁的删除操作;
b. 主表上有频繁的修改操作;
c. 业务上经常出现主表,从表关联查询。

Comments

Popular posts from this blog

Nginx Proxy & Load Balance & LNMP

Snort+barnyard2+Snorby CentOS 6.5_64 Installation

ORACLE Error