oracle数据库行锁(锁表)

oracle数据库行锁问题

oracle行锁

      • 问题说明:
      • 查看问题
      • 解决问题
      • 表字段说明
        • v$session 表字段说明
        • v$locked_object视图
        • all_objects(dba_objects) 表字段说明
      • 声明:

问题说明:

今天在执行一个简单的delete删除语句时,一直在执行,也不报错,经过盘查,怀疑是表锁主了,无法修改数据
可以执行一下sql来查看

查看问题

--查找oracle中被锁的行 所谓的行锁
SELECT l.session_id      "会话标识符",
       s.SERIAL# 		 "会话序列号",
       l.locked_mode     "锁模式",
       l.oracle_username "数据库名",
       l.os_user_name    "计算机用户名",
       s.machine         "操作系统机器名称(计算机组/名)",
       s.terminal        "计算机名",
       o.object_name     "数据库表名",
       s.program         "操作系统程序名称",
       s.logon_time      "时间"
  FROM v$locked_object l, all_objects o, v$session s
 WHERE l.object_id = o.object_id
   AND l.session_id = s.sid
 ORDER BY sid, s.serial#;

解决问题

--杀死 行锁
alter system kill session 'sid,serial#';	
或者
alter system kill session '会话标识符,会话序列号'; 

表字段说明

v$session 表字段说明

More ActionsColumn Datatype Description
SADDR RAW(4 | 8) 会话地址
SID NUMBER 会话标识符
SERIAL# NUMBER 会话序列号。 用于唯一标识会话的对象。 如果会话结束且另一个会话以相同的会话ID开始,则保证会话级命令应用于正确的会话对象。
AUDSID NUMBER 审核会话ID
PADDR RAW(4 | 8) 拥有会话的进程的地址
USER# NUMBER Oracle用户标识符
USERNAME VARCHAR2(128) Oracle用户名
COMMAND NUMBER 正在进行的命令
OWNERID NUMBER 拥有可迁移会话的用户的标识符; 如果值为2147483644,则列内容无效 对于使用Parallel Slaves的操作,将此值解释为4字节值。 低位2字节表示会话编号,高位字节表示查询协调器的实例ID。
TADDR VARCHAR2(16) 事务状态对象的地址
LOCKWAIT VARCHAR2(16) 会话等待的锁的地址; 如果没有则为NULL
STATUS VARCHAR2(8) 会议状况:ACTIVE - 当前正在执行SQL的会话;INACTIVE - 非活动且没有配置限制或尚未超出配置限制的会话;KILLED - 会话标记为已杀死;CACHED - 会话临时缓存以供Oracle * XA使用;SNIPED - 超出某些已配置限制的非活动会话(例如,为资源管理器使用者组指定的资源限制或用户配置文件中指定的idle_time)。 此类会议将不再允许再次活动。
SERVER VARCHAR2(9) 服务器类型:专用;共享;伪;POOLED; 没有
SCHEMA# NUMBER 架构用户标识符
SCHEMANAME VARCHAR2(128) 架构用户名
OSUSER VARCHAR2(128) 操作系统客户端用户名
PROCESS VARCHAR2(24) 操作系统客户端进程ID
MACHINE VARCHAR2(64) 操作系统机器名称
PORT NUMBER 客户端端口号
TERMINAL VARCHAR2(30) 操作系统终端名称
PROGRAM VARCHAR2(48) 操作系统程序名称
TYPE VARCHAR2(10) 会话类型
SQL_ADDRESS RAW(4 8)
SQL_HASH_VALUE NUMBER 与SQL_ADDRESS一起使用以标识当前正在执行的SQL语句
SQL_ID VARCHAR2(13) 当前正在执行的SQL语句的SQL标识符
SQL_CHILD_NUMBER NUMBER 当前正在执行的SQL语句的子编号
SQL_EXEC_START DATE 此会话当前执行的SQL执行开始的时间; 如果SQL_ID为NULL,则为NULL
SQL_EXEC_ID NUMBER SQL执行标识符; 如果SQL_ID为NULL或者尚未启动该SQL的执行,则为NULL(请参阅V $ SQL_MONITOR)
PREV_SQL_ADDR RAW(4 8)
PREV_HASH_VALUE NUMBER 与SQL_HASH_VALUE一起使用以标识最后执行的SQL语句
PREV_SQL_ID VARCHAR2(13) 执行的最后一个SQL语句的SQL标识符
PREV_CHILD_NUMBER NUMBER 执行的最后一个SQL语句的子编号
PREV_EXEC_START DATE SQL执行开始执行最后一次执行的SQL语句
PREV_EXEC_ID NUMBER 上次执行的SQL语句的SQL执行标识符
PLSQL_ENTRY_OBJECT_ID NUMBER 堆栈中最顶层PL / SQL子程序的对象ID; 如果堆栈上没有PL / SQL子程序,则为NULL
PLSQL_ENTRY_SUBPROGRAM_ID NUMBER 堆栈中最顶层PL / SQL子程序的子程序ID; 如果堆栈上没有PL / SQL子程序,则为NULL
PLSQL_OBJECT_ID NUMBER 当前正在执行的PL / SQL子程序的对象ID; 执行SQL时为NULL
PLSQL_SUBPROGRAM_ID NUMBER 当前正在执行的PL / SQL对象的子程序ID; 执行SQL时为NULL
MODULE VARCHAR2(64) 通过调用DBMS_APPLICATION_INFO.SET_MODULE过程设置的当前正在执行的模块的名称

v$locked_object视图

v$locked_object视图列出当前系统中哪些对象正被锁定,其主要字段说明如下:

字段名称 类型 说明
XIDUSN NUMBER 回滚段号;
XIDSLOT NUMBER 槽号;
XIDSQN NUMBER 序列号;
OBJECT_ID NUMBER 被锁对象标识;
SESSION_ID NUMBER 持有锁的会话(SESSION)标识;
ORACLE_USERNAME VARCHAR2(30) 持有该锁的用户的Oracle用户名;
OS_USER_NAME VARCHAR2(15) 持有该锁的用户的操作系统用户名;
PROCESS VARCHAR2(9) 操作系统的进程号;
LOCKED_MODE NUMBER 锁模式,取值同表三中的LMODE;

all_objects(dba_objects) 表字段说明

主要用来管理对象。

COLUMN_NAME DATA_TYPE 描述
EDITION_NAME VARCHAR2
NAMESPACE NUMBER
SECONDARY VARCHAR2
GENERATED VARCHAR2
TEMPORARY VARCHAR2
STATUS VARCHAR2 状态,如valid
TIMESTAMP VARCHAR2 时间
LAST_DDL_TIME DATE ddl时间
CREATED DATE 创建时间
OBJECT_TYPE VARCHAR2
DATA_OBJECT_ID NUMBER
OBJECT_ID NUMBER 对象id
SUBOBJECT_NAME VARCHAR2
OBJECT_NAME VARCHAR2 对象名,如表名t_user,库名等
OWNER VARCHAR2 用户名

声明:

声明:平时我没事的时候喜欢逛哔哩哔哩,CSDN,微信公众号,这也是我主要的学习来源,如果有需要和您相同的文章,请联系我,谢谢!!!

你可能感兴趣的:(数据库,oracle,数据库)