当前位置:   article > 正文

ORACLE-Oracle锁表及其解决方法_oric锁表

oric锁表

本文讲解开发经常会遇到的情况,即锁表与表解锁。

锁表

1、执行DML操作未提交锁表

当一个表被多个人操作时,假设A进行了DML操作,在没有提交的情况下,该表是上锁的,B是无法对该表进行DML操作的。若B进行DML,则会一直等待,直到该表解锁。如下步骤:

  1. 打开一个cmd,然后A查询表ex1。
  2. A对表ex1做delete操作,但不执行commit,就把运行界面一直放着。
  3. 这时打开另一个cmd,B仍然可以查询到表ex1。
  4. 但B无法再对表ex1进行delete操作,这时我们称表ex1被锁住了。
  5. 若B很迫切的想进行DML操作,但是一直处于等待,这时就要对该表解锁。
    在这里插入图片描述

2、手动锁表

登录scott用户,锁住表ex1。

--共享锁(S锁)
lock table ex1 in share mode nowait;
  • 1
  • 2

在这里插入图片描述

解锁表

解锁其实很容易,假设以上说的A、B所使用的cmd就在两隔壁,关闭A的cmd,这样B的delete操作就能正常运行了。难的是,开发并不知道还有谁在操作着这个数据库,也不知道谁执行了DML操作未提交,这时,就需要找到这个被锁住的会话,并将之杀死(kill)。

1、查询锁住的表

select
se.SID 会话id,
se.SERIAL# 会话序列号,
se.LOGON_TIME 登录时间,
se.MACHINE 造成锁表的机器,
se.OSUSER 造成锁表的机器的用户,
se.TYPE 会话类型,
lo.SESSION_ID 会话id,
lo.ORACLE_USERNAME 被锁对象的数据库名,
lo.OBJECT_ID 被锁对象id,
ob.OWNER 被锁对象拥有人,
ob.OBJECT_NAME 被锁对象名,
ob.OBJECT_TYPE 被锁对象类型
from v$locked_object lo left join  v$session se on lo.SESSION_ID=se.SID
left join dba_objects ob on lo.OBJECT_ID=ob.OBJECT_ID;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

2、杀死该会话

alter system kill session ‘sid,serial#’;

alter system kill session '226,2985';
  • 1

以上就是表上锁和解锁的全过程,希望能给看到这篇博客的人一些帮助。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/268511
推荐阅读
相关标签
  

闽ICP备14008679号