首页 > 其他分享 >enq: TX - row lock contention 问题排查思路

enq: TX - row lock contention 问题排查思路

时间:2023-07-13 21:01:21浏览次数:34  
标签:contention TX format column lock col session sql blocking

问题原因

应用反应堵塞,检查数据库等待事件出现’enq: TX - row lock contention’
 业务更新或者删除同一行记录
 对创建位图索引的列值更新
 对主键或唯一键插入相同记录

解决方案

在enq: TX - row lock contention发生的实例上执行查询:

set linesize 180
set pagesize 999
column username format a16
column event format a40
column sql_child_number format 9999 heading 'SQL Child|Number'
column blocking_instance format 9999 heading 'Blocker|Instance'
column blocking_session format 99999 heading 'Blocker|Session'
column FINAL_BLOCKING_INSTANCE format 9999 heading 'F_Blocker|Instance'
column FINAL_BLOCKING_SESSION format 99999 heading 'F_Blocker|Session'
column "Lock" format a6
column "Mode" format a6
Select sid,
       seq#,
       username,
       event,
       sql_id,
       sql_child_number,
       chr(to_char(bitand(p1, -16777216)) / 16777215) ||
       chr(to_char(bitand(p1, 16711680)) / 65535) "Lock",
       to_char(bitand(p1, 65535)) "Mode",
       blocking_instance,
       blocking_session,
       final_blocking_instance,
       final_blocking_session,
       last_call_et
  From v$session
 Where event = 'enq: TX - row lock contention';

关注blocking_instance/blocking_session和final_blocking_instance/final_blocking_session(适用于11g)

1) 如果final_blocking_instance/final_blocking_session没有变化,说明可能是由于某个进程没有提交事务导致的enq: TX = row lock contention
到holder所在的实例执行以下查询:

set lines 180 pages 999
column username format a15
column program format a35
column machine format a20
column event format a30
column sql_id format a13
column status format a10
Select s.sid,
       s.username,
       s.event,
       s.program,
       s.machine,
       s.sql_id,
       s.sql_child_number,
       s.status,
       s.last_call_et
  From v$session s
 Where s.sid in (&sid);

确认不是DB进程,对堵塞者生成kill语句:

set lines 200 pages 999
col username for a15
col machine for a20
col program for a35
col spid for 99999999999
col dbkill for a40
col oskill for a20
col service_name for a20
select a.username,
       a.program,
       b.addr,
       b.spid,
       'alter system kill session ''' || a.sid || ',' || a.serial# || ''';' "dbkill",
       'kill -9 ' || b.spid "oskill"
  from v$session a, v$process b
 where a.paddr = b.addr(+)
   and a.sid = &sid
--   and a.serial#=&serial
 order by a.username, a.program;

执行生成的dbkill命令后继续观察session状态,如果长时间没有消失,在OS级别执行生成的oskill命令(如果是DB 进程,不可随意kill,否则会导致系统crash):

ps –ef|grep &spid
kill -9 &spid

2) 如果blocking_instance/blocking_session和final_blocking_instance/final_blocking_session均在不停变化,说明可能是由于业务SQL执行慢或者是并发高于正常值导致。
确认应用模块,执行如下查询:

column username format a15
column program format a35
column machine format a20
column event format a30
column sql_id format a13
column status format a10
Select s.sid,
       s.username,
       s.event,
       s.program,
       s.machine,
       s.sql_id,
       s.sql_child_number,
       s.status,
       s.last_call_et
  From v$session s
 Where event = 'enq: TX - row lock contention'
 Order By event, sql_id;

查看SQL执行计划,进一步分析是否是SQL性能问题,如下查询生成查看SQL执行计划的语句:

set lines 160 pages 999
set long 99999
col PLAN_TABLE_OUTPUT for a160 
select sql_fulltext,
       parsing_schema_name,
       'select * from table(dbms_xplan.display_cursor(''' || sql_id ||
       ''',' || child_number || ',''all iostats last +PEEKED_BINDS''));' xplan
  from v$sql
 where sql_id = '&sql_id';

包括SQL本身性能问题或者并发突发性增长,这类情况下kill阻塞者并不能解决问题,通知应用处理,允许的条件下通过临时kill所有等待的会话释放:

col username for a15
col machine for a20
col program for a35
col spid for 99999999999
col dbkill for a40
col oskill for a20
Select a.username,
       a.program,
       a.machine,
       b.addr,
       b.spid,
       'alter system kill session ''' || a.sid || ',' || a.serial# || ''';' "dbkill",
       'kill -9 ' || b.spid "oskill"
  From v$session a, v$process b
 Where a.paddr = b.addr(+)
   And a.event = 'enq: TX - row lock contention'
   And a.type = ‘USER’
 Order By a.username, a.program;

【后续分析】
如果是固定阻塞者,根据blocker session信息,联系相关应用确认该事务未正常提交的原因,避免下次问题发生。
如果是SQL性能变差导致执行慢进而产生等待,进一步分析处理SQL性能问题。
如果SQL执行效率没有问题,那么有可能是并发异常导致的等待,根据应用模块及执行SQL的信息,联系相关应用及时处理并发过高的异常.

标签:contention,TX,format,column,lock,col,session,sql,blocking
From: https://blog.51cto.com/u_13482808/6716017

相关文章

  • Archlinux安装和配置fcitx5
    本文基于archlinux系统,搭配dwm窗口管理器进行配置fcitx5安装一些基础包的安装,关于fcitx5框架我们只需要安装fcitx5-im包就可以,这个包实际上就包含了:fcitx5fcitx5-configtoolfcitx5-gtkfcitx5-qt除此之外再安装中文插件和基本的主题sudopacman-Sfcitx5-imfcitx5-chin......
  • Python-变量类型.txt
     1python-变量类型笔记: 2 3 4 5 6################################################################################################ 7变量存储在内存中的值,这就意味着在创建变量时会在内存中开辟一个空间。 8 9基于变量的数据类型,解释器会分配指......
  • 1st-基础教程.txt
     1Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。 2Python由GuidovanRossum于1989年底发明,第一个公开发行版发行于1991年。 3 4像Perl语言一样,Python源代码同样遵循GPL(GNUGeneralPublicLicense)协议。 5 6官方宣布,2020......
  • vue 打开浏览器新标签页预览 pdf 和 txt 文档,以及新标签页标题修改
    1//在线查看2showOnline({id,fileExt,fileName}){3if(fileExt&&['jpg','jpeg','gif','bmp','png'].includes(fileExt.toLowerCase())){4download(`/file-item/${id}/downl......
  • Ubuntu资源暂时不可用 E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源
    ubuntu使用apt时出现Ubuntu资源暂时不可用E:无法获得锁/var/lib/dpkg/lock-frontend-open(11:资源暂时不可用)一般是已经存在apt进程占用了,通过ps-grep查看ps-grep|apt查到相关进程后通过kill删掉kill-93298kill-93302再依次执行下面命令sudorm/var/cache......
  • JUC 常用类 ReentrantLock
    ReentrantLock类内部总共存在Sync、NonfairSync、FairSync三个类NonfairSync与FairSync类继承自Sync类Sync类继承自AbstractQueuedSynchronizer抽象类内部类SyncabstractstaticclassSyncextendsAbstractQueuedSynchronizer{//序列号private......
  • GetX 关于报错 Null check operator used on a null value的解决
    import'package:flutter/material.dart';import'package:get/get.dart';import'logic.dart';classGetIndexPageextendsStatefulWidget{intcount;GetIndexPage({requiredthis.count,Key?key}):super(key:key);@overr......
  • NBD(Network Block Device)是一种用于网络存储的协议和技术。NBD服务器是一种提供网络块
    NBD(NetworkBlockDevice)是一种用于网络存储的协议和技术。NBD服务器是一种提供网络块设备服务的服务器,它允许用户通过网络连接来访问和管理块设备(如硬盘、SSD等),就像本地设备一样。NBD服务器的工作原理如下:NBD服务器将物理或虚拟块设备暴露为网络上的NBD设备。客户端使用NBD客......
  • nvm安装node报错Get "https://nodejs.org/dist/latest/SHASUMS256.txt": dial tcp 104
    windows上通过nvm管理node版本,在本地安装了nvm后,通过nvm安装node,报错了,信息:Couldnotretrievehttps://nodejs.org/dist/latest/SHASUMS256.txt.Gethttps://nodejs.org/dist/latest/SHASUMS256.txt:dialtcp104.20.23.46:443:i/otimeout 有了这样的信息,我......
  • VMware ESXi 7.0 U3n macOS Unlocker & OEM BIOS (标准版和厂商定制版)
    VMwareESXi7.0U3nmacOSUnlocker&OEMBIOS(标准版和厂商定制版)ESXi7.0标准版和Dell(戴尔)、HPE(慧与)、Lenovo(联想)、Inspur(浪潮)、Cisco(思科)定制版镜像请访问原文链接:https://sysin.org/blog/vmware-esxi-7-u3-oem/,查看最新版。原创作品,转载请保留出处。......