FREE教程
目录
  • 主页
  • Oracle教程
  • redis教程
  • hadoop
  • ODI教程
  • BIEE教程
Oracle优化
Oracle优化 Oracle性能优化概述 Oracle性能优化的基本方法 寻找Oracle性能问题中的关键点 操作系统资源对Oracle性能的重要性 oracle常见的性能故障 减少I/O读取提高Oracle运行效率 oracle如何解决锁表问题 如何解决表空间不足即数据文件达到最大值问题 oracle面试常见问题(一) Oracle面试常见问题(二)
分类导航
Oracle基础教程 PL/SQL教程 Oracle管理 Oracle备份和恢复 Oracle RAC Oracle优化 Oracle技术 redis基础教程 hadoop教程
    首页->Oracle教程->Oracle优化->oracle如何解决锁表问题
减少I/O读取提高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”进行年龄的修改,但是忘记提交,如下:

1554824068905_363024.png

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

1554824246373_474601.png

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

1554824425700_209728.png

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

1554824668417_524547.png

减少I/O读取提高Oracle运行效率
如何解决表空间不足即数据文件达到最大值问题
关于我们 | 免责声明 | Copyright ? 2018 FREE教程 | 备案号:闽ICP备18020855号-1
公安备案

闽公网安备 35020602001245号