oracle数据库锁表解决办法

oracle数据库锁表原理:

1、锁表发生在insert update 、delete 中
2、锁表的原理是 数据库使用独占式封锁机制,当执行上面的语句时,对表进行锁住,直到发生commite 或者 回滚 或者退出数据库用户
3、锁表的原因
(1) A程序执行了对 tableA 的 insert ,并还未 commite时,B程序也对tableA 进行insert 则此时会发生资源正忙的异常 就是锁表
(2)锁表常发生于并发而不是并行(并行时,一个线程操作数据库时,另一个线程是不能操作数据库的,cpu 和i/o 分配原则)
4、减少锁表的概率:
(1)减少insert 、update 、delete 语句执行 到 commite 之间的时间。具体点批量执行改为单个执行、优化sql自身的非执行速度
(2)如果异常对事物进行回滚
5.当真的发生锁表后,我们应当 kill 掉锁表的sql进程这样就可以解除锁表;

以上介绍引用自博客 https://blog.csdn.net/weixin_37889564/article/details/124428787

 

当oracle数据库锁表时,使用如下语句查看详情

 1 -- 查看被锁的表
 2 SELECT l.session_id sid, 
 3 s.serial#, 
 4 l.locked_mode 锁模式, 
 5 l.oracle_username 登录用户, 
 6 l.os_user_name 登录机器用户名, 
 7 s.machine 机器名, 
 8 s.terminal 终端用户名, 
 9 o.object_name 被锁对象名, 
10 s.logon_time 登录数据库时间 
11 FROM v$locked_object l, all_objects o, v$session s 
12 WHERE l.object_id = o.object_id 
13 AND l.session_id = s.sid 
14 ORDER BY sid, s.serial#;
1 -- 查看哪一句sql造成的锁表
2 SELECT s.sid, q.sql_text FROM v$sqltext q, v$session s WHERE q.address = s.sql_address AND s.sid = &sid -- 补全 &sid

 

解决锁表的办法:

执行如下语句,杀掉对应的应用进程

alter system kill session’sid,serial#’;sid,serial#中间用逗号分隔

注意: 应当注意对于 sid 在 100 以下的应当谨慎,可能该进程对应某个application,如对应某个事务,可以 kill

 

推荐阅读:https://cloud.tencent.com/developer/article/1451003

 

posted on 2022-06-06 10:08  老酒馆  阅读(4944)  评论(0编辑  收藏  举报

导航