데이터 베이스 MySQL 튜토리얼 enq:TX-rowlockcontention故障处理一则

enq:TX-rowlockcontention故障处理一则

Jun 07, 2016 pm 03:57 PM
다루다 잘못

一个很简单的问题,之所以让我对这个问题进行总结,一是因为没我想象的简单,在处理的过程中遇到了一些磕磕碰碰,甚至绕了一些弯路,二是引发了我对故障处理时的一些思考。 6月19日,下午5点左右,数据库出现了大量的enq: TX - row lock contention等待事件,

一个很简单的问题,之所以让我对这个问题进行总结,一是因为没我想象的简单,在处理的过程中遇到了一些磕磕碰碰,甚至绕了一些弯路,二是引发了我对故障处理时的一些思考。
6月19日,下午5点左右,数据库出现了大量的enq: TX - row lock contention等待事件,按照以往的经验,这类等待一般与业务逻辑有关,DBA能够做的事情,一般就是将锁等待着的连接信息,等待锁的SQL语句,甚至等待的具体数据行,还有就是锁持有者的连接信息,造成锁等待的SQL语句等一些基本信息提交给开发人员,修改业务逻辑。
注意 很多情况下,修改业务逻辑不是一时半会能够立即解决的事,有时候如果锁持有或者锁等待业务不是特别重要,可以与应用维护人员协商,先停掉这部分业务,让其它业务正常运行很多时候,数据库只有一个锁持有者,并且这个锁持有的连接也没有活动,可以与应用维护人员协商,尝试kill锁持有者,看看后续锁等待能否自动解决。这种情况一般是一个单独的连接出现僵死导致,kill掉持有者以后,问题自然就解决了另外一种情况就是,前天晚上上线后,平时运行好好的业务,也没出现锁等待,有一天出现了这类问题,而且kill掉锁持有者以后,问题无法得到解决(业务逻辑问题,kill掉以后,后续还会发生),这一般是前天晚上上线引起。 本来觉得数据库层提供信息很简单,结果与想象的有点区别,来看一下具体的过程 (1)查询锁信息,如下
SESS LMODE LMODE REQUEST TYPE EVENT SQL_TEXT
Holder: 4266 exclusive 6 0 TX SQL*Net message from client
Waiter: 3136 none 0 4 TX enq: TX - row lock contention insert into xxxxx(ID,xxx,xxxx,xxx,….) values(seq_xxx.nextval,:"SYS_B_0",:"SYS_B_1",:"SYS_B_2",:"SYS_B_3",:"SYS_B_4",:"SYS_B_5")
Holder: 2276 exclusive 6 0 TX SQL*Net message from client
Waiter: 1716 none 0 4 TX enq: TX - row lock contention insert into xxxxx(ID,xxx,xxxx,xxx,….) values(seq_xxx.nextval,:"SYS_B_0",:"SYS_B_1",:"SYS_B_2",:"SYS_B_3",:"SYS_B_4",:"SYS_B_5")
Holder: 1288 exclusive 6 0 TX SQL*Net message from client
Waiter: 1565 none 0 4 TX enq: TX - row lock contention insert into xxxxx(ID,xxx,xxxx,xxx,….) values(seq_xxx.nextval,:"SYS_B_0",:"SYS_B_1",:"SYS_B_2",:"SYS_B_3",:"SYS_B_4",:"SYS_B_5")
Holder: 1000 exclusive 6 0 TX SQL*Net message from client
Waiter: 1147 none 0 4 TX enq: TX - row lock contention insert into xxxxx(ID,xxx,xxxx,xxx,….) values(seq_xxx.nextval,:"SYS_B_0",:"SYS_B_1",:"SYS_B_2",:"SYS_B_3",:"SYS_B_4",:"SYS_B_5")
Holder: 2989 exclusive 6 0 TX SQL*Net message from client
Waiter: 862 none 0 4 TX enq: TX - row lock contention insert into xxxxx(ID,xxx,xxxx,xxx,….) values(seq_xxx.nextval,:"SYS_B_0",:"SYS_B_1",:"SYS_B_2",:"SYS_B_3",:"SYS_B_4",:"SYS_B_5")
备注:表名和列名做了模糊化 可以看到,锁等待语句正在等待Insert条记录 (2)通过查看锁持有者,已经执行的语句,来判断到底是那个语句造成了锁等待,查询语句如下: select b.sql_text ,a.* from v$open_cursor a,v$sql b where a.sql_id=b.sql_id and a.sid=4266 and upper(b.sql_text) like '%xxxxx%'; (3) 根据经验insert一条语句被阻塞,一般是由于主键约束引起(另一个连接也插入了同一条语句或者删除了一条语句,但是没有提交) 但是我通过上面的语句查询的时候,发现怎么也找不到锁持有者有执行过这个表的任何DML,而且询问开发人员,他们也说没有对这张表的DML操作 其中open_cursor为1000,v$open_cursor中的记录也远远没有达到这个数,才100条不到。session_cached_cursors设置为200,没有道理这个连接执行的语句游标已经被刷新出去 (4)还真没有遇到过类似的问题,怎么也找不到。这时我换了一个想法,抛开那些经验,我在想,是不是有一种可能不对Insert插入语句进行任何DML操作,也会造成一条插入语句被锁掉?? 我考虑了这张表的依赖对象是不是会造成种类等待,例如触发器、外键引用等等。 仔细考虑一番,发现触发器,审计什么的,数据库应该能定位到具体的语句,而不是发生在这个insert语句本身(就算是递归语句,Oracle也能捕获到才对),因此,最让我怀疑的就是外键引用,通过下面这个查询,判断是否这个表通过外键引用了其他对象,如下 select a.table_name, a.owner, a.constraint_name, a.constraint_type, a.r_owner, a.r_constraint_name,--被外键引用的约束名 b.table_name --被外键引用的表名 from dba_constraints a, dba_constraints b where a.constraint_type = 'R' and a.r_constraint_name = b.constraint_name and a.r_owner = b.owner and b.table_name = 'xxxxx' and b.owner=''; 查询发现,确实有一张表引用这个插入等待的表,这时,顿时感觉希望很大。 (5)通过一个简单的测试,我验证我的推测,如下 create table t3 (id number primary key,name varchar2(20),product_id number); create table t2 (id number primary key,name varchar2(20)); alter table t3 add constraint FK_PRODUCTSTAT_PRODUCTID foreign key (PRODUCT_id) references t2 (ID); SQL> insert into t2 values(1,'dh'); 1 row inserted SQL> insert into t2 values(2,'cc'); 1 row inserted SQL> insert into t2 values(3,'cc'); 1 row inserted SQL> commit; Commit complete session 1执行如下操作: SQL> select * from t2; ID NAME ---------- -------------------- 1 dh 2 cc 3 cc SQL> select * from t3; ID NAME PRODUCT_ID ---------- -------------------- ---------- --可以看到,这时t3表有任何记录 SQL> insert into t2 values(4,'cc'); --对父表执行一条插入 1 row inserted、 session2 t2表执行一条插入操作,如下 insert into t3 values(1,'tt',4); 令人惊喜的是,确实发生了锁等待,与我们遇到的锁等待类型一模一样。 (6)查询锁持有者,是否有对锁等待表的父表有进行DML操作,如下 select b.sql_text ,a.* from v$open_cursor a,v$sql b where a.sql_id=b.sql_id and a.sid=4266 and upper(b.sql_text) like '%xxxxx_ref%'; 检查结果与我们预期的一致,确实有很多对主表的插入操作! (7)基本我们已经确定是什么语句导致锁堵塞,将语句提交给开发人员,修改代码后,问题解决!
问题总结 其实这个问题本身不难,值得思考的是,为什么一个这么简单的问题,无法立即找到原因。说到底,很多时候都是经验束缚了我们,在遇到这类问题时,我们需要抛开已有的那些经验,通过数据库的原理来发现根本原因。因此,理论知识再怎么强调都不过分,它真的很重要,理解了原理,你才可以举一反三,游刃有余,而不是每次一碰到没见过的问题都战战兢兢!
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

CPU를 너무 많이 점유하는 WIN10 서비스 호스트의 동작 과정 CPU를 너무 많이 점유하는 WIN10 서비스 호스트의 동작 과정 Mar 27, 2024 pm 02:41 PM

1. 먼저 작업 표시줄의 빈 공간을 마우스 오른쪽 버튼으로 클릭하고 [작업 관리자] 옵션을 선택하거나, 시작 로고를 마우스 오른쪽 버튼으로 클릭한 후 [작업 관리자] 옵션을 선택합니다. 2. 열린 작업 관리자 인터페이스에서 맨 오른쪽에 있는 [서비스] 탭을 클릭합니다. 3. 열린 [서비스] 탭에서 아래의 [서비스 열기] 옵션을 클릭하세요. 4. 열리는 [서비스] 창에서 [InternetConnectionSharing(ICS)] 서비스를 마우스 오른쪽 버튼으로 클릭한 후 [속성] 옵션을 선택하세요. 5. 열리는 속성 창에서 [연결 프로그램]을 [사용 안 함]으로 변경하고 [적용]을 클릭한 후 [확인]을 클릭하세요. 6. 시작 로고를 클릭한 후 종료 버튼을 클릭하고 [다시 시작]을 선택한 후 컴퓨터를 다시 시작합니다.

Black Shark 휴대폰이 켜지지 않으면 어떻게 해야 합니까? 자신을 구하는 방법을 가르쳐주세요! Black Shark 휴대폰이 켜지지 않으면 어떻게 해야 합니까? 자신을 구하는 방법을 가르쳐주세요! Mar 23, 2024 pm 04:06 PM

Black Shark 휴대폰이 켜지지 않으면 어떻게 해야 합니까? 자신을 구하는 방법을 가르쳐주세요! 일상생활에서 휴대폰은 우리에게 없어서는 안 될 필수품이 되었습니다. 많은 사람들에게 Black Shark 휴대폰은 사랑받는 게임용 휴대폰입니다. 그러나 다양한 문제에 직면하게 되는 것은 불가피하며, 그 중 하나는 전화기가 켜지지 않는다는 것입니다. 그러한 상황이 발생하더라도 당황하지 마십시오. 다음은 도움이 될 수 있는 몇 가지 해결 방법입니다. 우선, 블랙샤크 휴대폰이 켜지지 않을 경우 먼저 휴대폰의 전원이 충분한지 확인하세요. 배터리가 방전되어 휴대폰이 켜지지 않을 수도 있습니다.

0x0000004e 오류는 무엇을 의미합니까? 0x0000004e 오류는 무엇을 의미합니까? Feb 18, 2024 pm 01:54 PM

0x0000004e 오류란 무엇입니까? 오류는 컴퓨터 시스템에서 흔히 발생하는 문제입니다. 컴퓨터에 오류가 발생하면 일반적으로 시스템이 제대로 실행될 수 없기 때문에 시스템이 종료되거나 충돌하거나 오류 메시지가 표시됩니다. Windows 시스템에는 시스템에 심각한 오류가 발생했음을 나타내는 블루 스크린 오류 코드인 특정 오류 코드 0x0000004e가 있습니다. 0x0000004e 블루 스크린 오류는 시스템 커널 또는 드라이버 문제로 인해 발생합니다. 이 오류로 인해 일반적으로 컴퓨터 시스템이

CSV 파일 조작에 대한 빠른 가이드 CSV 파일 조작에 대한 빠른 가이드 Dec 26, 2023 pm 02:23 PM

CSV 형식 파일을 열고 처리하는 방법을 빠르게 배우십시오. 데이터 분석 및 처리의 지속적인 개발로 인해 CSV 형식은 널리 사용되는 파일 형식 중 하나가 되었습니다. CSV 파일은 다양한 데이터 필드가 쉼표로 구분되어 있는 간단하고 읽기 쉬운 텍스트 파일입니다. 학술 연구, 비즈니스 분석, 데이터 처리 등 CSV 파일을 열고 처리해야 하는 상황에 자주 직면하게 됩니다. 다음 가이드는 CSV 형식 파일을 열고 처리하는 방법을 빠르게 배우는 방법을 보여줍니다. 1단계: CSV 파일 형식 이해하기 먼저,

0x00000001 블루 스크린 오류를 수정하는 방법 0x00000001 블루 스크린 오류를 수정하는 방법 Feb 19, 2024 pm 11:12 PM

0x00000001 블루 스크린 문제는 어떻게 해야 할까요? 블루 스크린 문제는 많은 컴퓨터 사용자들이 자주 겪는 골칫거리입니다. 컴퓨터에 블루 스크린이 발생하면 갑자기 실행이 중단되고 오류 코드와 함께 블루 스크린 인터페이스가 표시됩니다. 그 중 0x00000001은 일반적인 블루 스크린 오류 코드입니다. 블루 스크린 문제는 소프트웨어 오류, 하드웨어 오류, 드라이버 문제 등을 포함한 다양한 이유로 인해 발생할 수 있습니다. 이 문제가 실망스러울 수 있지만 이를 해결하기 위해 할 수 있는 일이 있습니다. 아래에서는 블루 스크린에 대한 몇 가지 솔루션을 소개하겠습니다.

PHP에서 특수 문자를 처리하고 작은따옴표를 변환하는 방법을 알아보세요. PHP에서 특수 문자를 처리하고 작은따옴표를 변환하는 방법을 알아보세요. Mar 27, 2024 pm 12:39 PM

PHP 개발 과정에서 특수 문자를 처리하는 것은 일반적인 문제이며, 특히 문자열 처리에서는 특수 문자가 이스케이프되는 경우가 많습니다. 그중에서도 특수 문자를 작은따옴표로 변환하는 것은 상대적으로 일반적인 요구 사항입니다. 왜냐하면 PHP에서는 작은따옴표가 문자열을 래핑하는 일반적인 방법이기 때문입니다. 이 기사에서는 PHP에서 특수 문자 변환 작은따옴표를 처리하는 방법을 설명하고 구체적인 코드 예제를 제공합니다. PHP에서 특수 문자에는 작은따옴표('), 큰따옴표("), 백슬래시() 등이 포함되지만 이에 국한되지는 않습니다.

그래픽 카드 팬 정지 이유 및 해결 방법 그래픽 카드 팬 정지 이유 및 해결 방법 Dec 26, 2023 pm 05:49 PM

많은 친구들이 그래픽 카드를 새로 구입했는데 며칠 동안 갑자기 팬이 회전하지 않습니다. 이유는 무엇입니까? 섀시에 있는 그래픽 카드를 확인하면 됩니다. 메모리와 하드디스크 케이블은 연결되어 있는데 전원이 들어오지 않는군요. 전압이 불안정한가요? 그래픽 카드 팬이 회전하지 않는 이유에 대해 알아보겠습니다. 1. 전원 공급 장치가 부족하면 팬이 회전하지 않게 됩니다. 가장 일반적인 이유 중 하나는 컴퓨터 프로그램의 정상적인 작동을 유지하기 위해 전원 공급 장치에서 제공하는 에너지가 그래픽 카드의 요구 사항을 충족할 수 없기 때문입니다. 그래픽 카드는 GPU 코어가 계속해서 계산을 수행할 수 있도록 냉각 팬을 멈추게 됩니다. 이러한 상황이 발생하더라도 그래픽 카드가 강력하지 않다고 비난하지 마십시오! 확실히 배려가 깊은 것 같군요. 그렇죠?

Black Shark 휴대폰 충전 문제 해결 및 솔루션 Black Shark 휴대폰 충전 문제 해결 및 솔루션 Mar 22, 2024 pm 09:03 PM

Black Shark는 강력한 성능과 탁월한 게임 경험으로 유명한 스마트폰 브랜드입니다. 그러나 다른 스마트폰과 마찬가지로 Black Shark 휴대폰에도 다양한 문제가 있으며 그 중 충전 실패가 흔한 문제입니다. 충전 실패는 휴대폰의 정상적인 사용에 영향을 미칠 뿐만 아니라 더 심각한 문제를 일으킬 수도 있으므로 충전 문제를 적시에 해결하는 것이 매우 중요합니다. 이 기사에서는 Black Shark 휴대폰 충전 실패의 일반적인 원인부터 시작하여 충전 문제를 해결하는 방법을 소개하고 독자가 Black Shark 휴대폰 충전 문제를 해결하는 데 도움이 되기를 바랍니다.

See all articles