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如何解决锁表问题1

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

oracle如何解决锁表问题

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

oracle如何解决锁表问题

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

oracle如何解决锁表问题