oracle如何解决锁表问题

oracle如何解决锁表问题

Oracle在日常开发过程中,或者业务上线使用过程中,我们会经常遇到锁表问题,导致某一个业务奔溃。这是因为当多个用户同时操作一个表时,或者同一条数据时,很容易发生锁表的情况。这是,由于Oracle数据库为了保持数据的一致性,当某一个用户正在操作一条数据时,若忘记提交,另外一个用户又要对其进行修改时。由于上个操作未提交,导致下一个修改操作一直处于等待状态,当时间长了,就会导致锁表情况的发生。

当我们出现锁表时,新的修改事务发生时,会报下面的错误:

record is locked by another user;

或是出现某一个修改业务长期处于卡死状态,可以考虑是出现锁表的可能性。可以通过数据字典v$session、v$locked_object等进行关联查询出正处于一直在执行的SQL的sessionID和对应的SQL语句。代码如下:

查看锁表进程SQL语句1:
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;
查看锁表进程SQL语句2:
select * from v$session t1, v$locked_object t2 where t1.sid = t2.SESSION_ID;

然后,通过查询出来锁表的SID和serial#对对应的session进行kill(杀死)。代码如下:

alter system kill session 'SID,serial#'; 

案例:

1、对学生信息表(stuinfo)中学生“SC201801006”进行年龄的修改,但是忘记提交,如下:

oracle如何解决锁表问题

2、然后,通过另外一个窗口,对其进行update操作,修改其年级为“2019”,模拟锁表情况,代码如下:

oracle如何解决锁表问题

3、发现,由于第一个窗口为提交数据,导致update操作一直处于等待,这时我们通过锁表语句查询数据库的是否存在锁表情况,如下:

oracle如何解决锁表问题

4、这时可以通过 kill语句杀死第一个未提交的会话,或者主动对第一个窗口的修改语句进行提交,即可解除锁表情况。

oracle如何解决锁表问题

文章推荐:

​Oracle性能优化的基本方法 - FREE教程

oracle常见的性能故障 - FREE教程

Oracle教程_Oracle在线学习教程_FREE教程

展开阅读全文

页面更新:2024-05-16

标签:会报   在线   表语   语句   进程   表情   窗口   性能   发生   操作   代码   业务   教程   数据   用户   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top