• oracle锁表


    一、锁表的处理

    Oracle锁表比较简单,查询锁表的session杀掉就可以了。

    1、以下几个为相关表

    SELECT * FROM V$LOCK;
    
    SELECT * FROM V$SQLAREA;
    
    SELECT * FROM V$SESSION;
    
    SELECT * FROM V$PROCESS;
    
    SELECT * FROM V$LOCKED_OBJECT;
    
    SELECT * FROM ALL_OBJECTS;
    
    SELECT * FROM V$SESSION_WAIT;

    2、查看被锁的表

    SELECT B.OWNER, B.OBJECT_NAME, A.SESSION_ID, A.LOCKED_MODE
      FROM V$LOCKED_OBJECT A, DBA_OBJECTS B
     WHERE B.OBJECT_ID = A.OBJECT_ID;

    3、查看那个用户那个进程造成死锁

    SELECT B.USERNAME, B.SID, B.SERIAL#, LOGON_TIME
      FROM V$LOCKED_OBJECT A, V$SESSION B
     WHERE A.SESSION_ID = B.SID
     ORDER BY B.LOGON_TIME;

    4、查看连接的进程

    SELECT SID, SERIAL#, USERNAME, OSUSER FROM V$SESSION;

    5、查出锁定表的sid, serial#,os_user_name, machine_name, terminal,锁的type,mode

    SELECT S.SID,
           S.SERIAL#,
           S.USERNAME,
           S.SCHEMANAME,
           S.OSUSER,
           S.PROCESS,
           S.MACHINE,
           S.TERMINAL,
           S.LOGON_TIME,
           L.TYPE
      FROM V$SESSION S, V$LOCK L
     WHERE S.SID = L.SID
       AND S.USERNAME IS NOT NULL
     ORDER BY SID;

    6、  这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。

    7、杀掉进程 sid,serial#

    ALTER SYSTEM KILL SESSION'210,11562';

    二、for update 与 rowid 区别

    有时候部分技术人员在更新记录时会忘记提交事务,造成锁表。故引出此内容。

    1、Oracle 更新表的方式常用的几种:

    (1)、update 表名 set 字段1=值1,字段2=值2 ... where 过滤条件;

    (2)、select * from 表名 where 过滤条件 for update ;--锁定某行记录或整张表,一直等待,直到提交或回滚。

    拓展:

        select * from 表名 where 过滤条件 for update of 列名 ;(用在多表连接锁定时,可以指定要锁定的是哪几张表,而如果表中的列没有在for update of 后面出现的话,就意味着这张表其实并没有被锁定,其他用户是可以对这些表的数据进行update操作的。这种情况经常会出现在用户对带有连接查询的视图进行操作场景下。用户只锁定相关表的数据,其他用户仍然可以对视图中其他原始表的数据来进行操作。 

        select * from 表名 where 过滤条件 for update 【of 列名】 wait 时间;--等待n秒后返回错误提示

        select * from 表名 where 过滤条件 for update【of 列名】  nowait  ;--马上返回错误提示

    (3)、select 要更新的字段,rowid from 表名 where 过滤条件;

    (4)、merge语句(用的相对比较少)

    2、for update与rowid区别

    for update :当语句运行时,会在对应行(where子句)加上行级锁,无where子句等于全表上锁。若遇到客户端断网、测试人员忘记提交回滚事务,则会发生锁表。 

    rowid: 运行后并未给数据加上行级锁(通过物理地址去确定某一行数据),但可以编辑数据,提交事务的瞬间完成上锁、提交、解锁等动作,不易发生锁表。

    参考:

    https://www.cnblogs.com/XQiu/p/5212787.html

     oracle for update和for update nowait的区别 - 全威儒 - 博客园  https://www.cnblogs.com/quanweiru/archive/2012/11/09/2762223.html

    【Oracle】-for update 与 rowid - zhaizhai的博客 - CSDN博客  http://blog.csdn.net/zhailihua/article/details/78716347

  • 相关阅读:
    理解jquery的$.extend()、$.fn和$.fn.extend()
    Angularjs,WebAPI 搭建一个简易权限管理系统
    ASP.NET MVC Boilerplate简介
    写jQuery插件
    给Asp.Net MVC及WebApi添加路由优先级
    Oracle数据库之开发PL/SQL子程序和包
    Git 1.9.5.msysgit.1
    快速解读GC日志(转)
    Git & Github 一页简明笔记(转)main
    用python3.x与mysql数据库构建简单的爬虫系统(转)
  • 原文地址:https://www.cnblogs.com/chinas/p/8253451.html
Copyright © 2020-2023  润新知