ORACLE锁表

1. 锁模式:0(None),1(null),2(row share), 3(row exclusive),4 (share),5(share row exclusive),6(exclusive)

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

2.v$locked_object视图字段说明

字段名称

类型

说明

XIDUSN

NUMBER

回滚段号;

XIDSLOT

NUMBER

槽号;

XIDSQN

NUMBER

序列号;

OBJECT_ID

NUMBER

被锁对象标识;

SESSION_ID

NUMBER

持有锁的会话(SESSION)标识;

ORACLE_USERNAME

VARCHAR2(30)

持有该锁的用户的Oracle用户名;

OS_USER_NAME

VARCHAR2(15)

持有该锁的用户的操作系统用户名;

PROCESS

VARCHAR2(9)

操作系统的进程号;

LOCKED_MODE

NUMBER

锁模式;

3.v$lock视图字段说明

字段名称

类型

说明

SID

NUMBER

会话(SESSION)标识;

TYPE

VARCHAR(2)

区分该锁保护对象的类型;

ID1

NUMBER

锁标识1;

ID2

NUMBER

锁标识2;

LMODE

NUMBER

锁模式:0(None),1(null),2(row share), 3(row exclusive),4 (share),5(share row exclusive),6(exclusive)

REQUEST

NUMBER

申请的锁模式:具体值同上面的LMODE

CTIME

NUMBER

已持有或等待锁的时间;

BLOCK

NUMBER

是否阻塞其它锁申请;

4.死锁相关的查询语句

(1)查询死锁占用的时间

SELECT decode(request, 0, 'holder:', 'waiter:') || sid sid,
       id1,
       id2,
       lmode,
       request,
       TYPE,
       ctime / 60 锁定时间
  FROM v$lock
 WHERE (id1, id2, TYPE) IN
       (SELECT id1, id2, TYPE FROM v$lock WHERE request > 0)
 ORDER BY id1, request

(2)查询以下语句得到 SID和SERIAL#,使用 ALTER SYSTEM KILL SESSION '查出的SID,查处的SERIAL#' 杀死进程。

例如:ALTER SYSTEM KILL SESSION '30,819';

SELECT sess.sid,
       sess.serial#,
       lo.oracle_username,
       lo.os_user_name,
       ao.object_name,
       lo.locked_mode
  FROM v$locked_object lo, dba_objects ao, v$session sess
 WHERE ao.object_id = lo.object_id
   AND lo.session_id = sess.sid

(3)如果在ORACLE中不能杀死进程,我们只能到操作系统中,使用操作系统命令杀死进程。

查询一下语句得到SPID,使用 KILL -9 "查出的SPID"

SELECT a.username,
       a.machine,
       a.program,
       b.spid,
       a.sid,
       a.serial#,
       a.status,
       c.piece,
       c.sql_text
  FROM v$locked_object lo,
       v$session a, v$process b, v$sqltext c
 WHERE lo.session_id = a.sid
   AND b.addr = a.paddr
   AND a.sql_address = c.address(+)
 ORDER BY c.piece;



### Oracle 数据库中的原因及解决方案 #### 1. **的基本原理** 在Oracle数据库中,“”是一种保护机制,用于维护事务的一致性和隔离性。当某个会话对特定的修改操作(如 `INSERT`、`UPDATE` 或 `DELETE`),Oracle会在这些资源上施加定,防止其他会话在同一时间对其进更改[^1]。 #### 2. **的主要原因** 以下是可能导致的一些常见场景: - 当前有未提交的事物正在占用某些或记录。 - 长时间运的大规模更新或删除语句未能及时释放- 用户意外终止了某项正在进的操作,但并未清理残留的状态。 - 应用程序设计缺陷导致死现象发生。 #### 3. **检测当前存在的情况** 为了找出谁持有以及哪些对象受到影响,可以通过查询动态视图获取相关信息: ```sql SELECT s.sid, s.serial#, o.object_name, l.locked_mode FROM v$locked_object l JOIN dba_objects o ON l.object_id = o.object_id JOIN v$session s ON l.session_id = s.sid; ``` 这段脚本能够返回所有被定的对象名称连同对应的会话ID等细节信息[^2]。 #### 4. **解除的方法** 一旦确认了具体的定源之后,就可以采取相应措施解决问题: ##### 方法一:手动杀死阻塞进程 如果确定某个特定SID造成了不必要的干扰,则可以直接将其关闭从而立即消除影响: ```bash ALTER SYSTEM KILL SESSION 'sid,serial#'; ``` 注意这里的单引号内需填入前面查出来的实际数值[^3]。 ##### 方法二:定期监控与预防策略实施 建立完善的运维体系非常重要,包括但不限于设立合理的超时限制、优化索引结构减少全扫描几率等方面工作都能有效降低出现此类状况的可能性。 #### 5. **避免未来再次发生的建议** - 教育开发者遵循良好的编程习惯,确保每次变更完成后都尽快commit或者rollback; - 对于耗时较长的任务考虑分批处理而非一次性加载全部数据; - 利用分区技术分散热点区域压力; --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值