[转帖]模拟enq: TX - row lock contention争用
https://www.modb.pro/db/623036
enq: TX - row lock contention它表示一个事务正在等待另一个事务释放被锁定的行。这种等待事件通常发生在并发访问数据库时,多个事务试图同时修改同一行数据时会发生行级锁争用。
以下是可能导致 “enq: TX - row lock contention” 等待事件的一些常见原因:
1、并发性高:当多个事务同时访问同一行数据时,就会发生锁争用。这种情况通常在高并发应用中发生。
2、事务时间较长:如果一个事务长时间占用某一行或表资源,其他事务就会等待该资源的释放,这也会导致锁争用。
3、索引设计:如果表没有恰当的索引或索引设计不合理,就会导致查询时扫描大量的数据行,从而增加锁争用的可能性。
4、数据库性能问题:如果数据库的性能出现问题,比如CPU使用率过高,I/O等待时间过长等,就会导致锁争用等待事件的发生。
1、当多个session改变同一行时
session 1
SQL> create table test_table (
2 id number primary key,
3 name varchar2(50),
4 value number
5 );
Table created.
SQL> insert into test_table values (1, 'test', 100);
1 row created.
SQL> commit
2 ;
Commit complete.
SQL> update test_table set value = 200 where id = 1;
1 row updated.
session 2
SQL> update test_table set value = 300 where id = 1;
session 3
SQL> @swc sid||':'||serial#||':'||sql_id||':'||event||':'||p1||':'||p2 1=1
old 5: REPLACE(SYS_CONNECT_BY_PATH(&1, '->'), '->', ' -> ')
new 5: REPLACE(SYS_CONNECT_BY_PATH(sid||':'||serial#||':'||sql_id||':'||event||':'||p1||':'||p2, '->'), '->', ' -> ')
old 34: START WITH (ses.state='WAITING' AND ses.wait_class!='Idle') AND &2
new 34: START WITH (ses.state='WAITING' AND ses.wait_class!='Idle') AND 1=1
SESSIONS PATH
---------- --------------------------------------------------------------------------------------------------------------------------------------------
1 -> 254:11896:6f702u1hk7xgg:enq: TX - row lock contention:1415053318:393216 -> 237:20405::SQL*Net message from client:1650815232:1
1 -> 254:11896:6f702u1hk7xgg:enq: TX - row lock contention:1415053318:393216
SQL> select * from v$lock where type in ('TM','TX');
ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK CON_ID
---------------- ---------------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ---------- ----------
000000007D49C910 000000007D49C940 254 TX 196618 2441 0 6 198 0 0
00007F2437305AC8 00007F2437305AF0 237 TM 76931 0 3 0 203 0 0
00007F2437305AC8 00007F2437305AF0 254 TM 76931 0 3 0 198 0 0
00000000790CD360 00000000790CD398 237 TX 196618 2441 6 0 203 1 0
SQL> select * from v$locked_object;
XIDUSN XIDSLOT XIDSQN OBJECT_ID SESSION_ID ORACLE_USERNAME OS_USER_NAME PROCESS LOCKED_MODE CON_ID
---------- ---------- ---------- ---------- ---------- ------------------------------ -------------------- --------------- ----------- ----------
3 10 2441 76931 237 SYS oracle 8108 3 0
0 0 0 76931 254 SYS oracle 7650 3 0
237和254同时在76931对象上加了3级共享锁,237号会话持有事务
2、当多个session导致唯一键冲突
session 1
SQL> CREATE TABLE test_table (
2 id NUMBER PRIMARY KEY,
3 name VARCHAR2(50) UNIQUE
4 );
Table created.
SQL> INSERT INTO test_table (id, name) VALUES (1, 'test');
1 row created.
session 2
SQL> INSERT INTO test_table (id, name) VALUES (1, 'test');
session 3
SQL> @swc sid||':'||serial#||':'||sql_id||':'||event||':'||p1||':'||p2 1=1
old 5: REPLACE(SYS_CONNECT_BY_PATH(&1, '->'), '->', ' -> ')
new 5: REPLACE(SYS_CONNECT_BY_PATH(sid||':'||serial#||':'||sql_id||':'||event||':'||p1||':'||p2, '->'), '->', ' -> ')
old 34: START WITH (ses.state='WAITING' AND ses.wait_class!='Idle') AND &2
new 34: START WITH (ses.state='WAITING' AND ses.wait_class!='Idle') AND 1=1
SESSIONS PATH
---------- --------------------------------------------------------------------------------------------------------------------------------------------
1 -> 254:11896:5usmba4xn6bwc:enq: TX - row lock contention:1415053316:524291 -> 237:4551::SQL*Net message from client:1650815232:1
1 -> 254:11896:5usmba4xn6bwc:enq: TX - row lock contention:1415053316:524291
SQL> select * from v$lock where type in ('TM','TX') order by sid;
ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK CON_ID
---------------- ---------------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ---------- ----------
000000007CC26AE8 000000007CC26B20 237 TX 524291 2425 6 0 86 1 0
00007F2437B866F0 00007F2437B86718 237 TM 76933 0 3 0 86 0 0
000000007EF5B3A8 000000007EF5B3E0 254 TX 589855 2470 6 0 79 0 0
000000007D49C4E8 000000007D49C518 254 TX 524291 2425 0 4 79 0 0
00007F2437B866F0 00007F2437B86718 254 TM 76933 0 3 0 79 0 0
237和254同时在对象76933加了共享锁,也同时获得了6级锁,但是254需要申请4级锁导致阻塞
session 1
SQL> commit;
Commit complete.
session 2
SQL> INSERT INTO test_table (id, name) VALUES (1, 'test');
INSERT INTO test_table (id, name) VALUES (1, 'test')
*
ERROR at line 1:
ORA-00001: unique constraint (SYS.SYS_C007696) violated
区别:如果update导致的enq: TX - row lock contention,为数据行上锁导致,与程序设置有关。
如果insert导致enq: TX - row lock contention,则为唯一约束导致的,好的解决方案是使用序列生成唯一键。
session 1
SQL> CREATE SEQUENCE my_sequence
2 START WITH 1
3 INCREMENT BY 1
4 MAXVALUE 999999999
5 CYCLE;
Sequence created.
SQL> INSERT INTO test_table (id, name) VALUES (my_sequence.nextval, 'c');
1 row created.
session 2
SQL> INSERT INTO test_table (id, name) VALUES (my_sequence.nextval, 'd');
1 row created.
session 3
SQL> @swc sid||':'||serial#||':'||sql_id||':'||event||':'||p1||':'||p2 1=1
old 5: REPLACE(SYS_CONNECT_BY_PATH(&1, '->'), '->', ' -> ')
new 5: REPLACE(SYS_CONNECT_BY_PATH(sid||':'||serial#||':'||sql_id||':'||event||':'||p1||':'||p2, '->'), '->', ' -> ')
old 34: START WITH (ses.state='WAITING' AND ses.wait_class!='Idle') AND &2
new 34: START WITH (ses.state='WAITING' AND ses.wait_class!='Idle') AND 1=1
no rows selected
session 1 提交
SQL> commit;
Commit complete.
session 2 提交
SQL> commit;
Commit complete.
SQL> select * from SQL> commit;
select * from SQL> commit
*
ERROR at line 1:
ORA-00933: SQL command not properly ended
SQL>
SQL> Commit complete.
2
SQL>
SQL> select * from test_table;
ID NAME
---------- ----------------------------------------------------------------------------------------------------
6 c
7 d
测试2
SQL> CREATE TABLE test_table (
2 id NUMBER PRIMARY KEY,
3 name VARCHAR2(50)
4 );
Table created.
SQL>
SQL> CREATE BITMAP INDEX test_index ON test_table(name);
Index created.
SQL> INSERT INTO test_table
2 SELECT LEVEL, 'Name' || MOD(LEVEL, 5) FROM DUAL CONNECT BY LEVEL <= 1000000;
1000000 rows created.
SQL> commit;
Commit complete.
session 1
SQL> UPDATE test_table SET name = 'NewName' WHERE name = 'Name1';
session 2
SQL> UPDATE test_table SET name = 'NewName' WHERE name = 'Name2';
session 3
SQL> SELECT * FROM test_table WHERE name = 'Name1' for update;
session 4
SQL> sELECT * FROM test_table WHERE name = 'Name2' for update;
等待
EVENT SID
------------------------------ ----------
enq: TX - row lock contention 35
enq: TX - row lock contention 41
resmgr:cpu quantum 237
resmgr:cpu quantum 254
EVENT SID
------------------------------ ----------
enq: TX - row lock contention 35
enq: TX - row lock contention 41
SQL*Net message from client 237
enq: TX - row lock contention 254
SQL> @swc sid||':'||serial#||':'||sql_id||':'||event||':'||p1||':'||p2 1=1
old 5: REPLACE(SYS_CONNECT_BY_PATH(&1, '->'), '->', ' -> ')
new 5: REPLACE(SYS_CONNECT_BY_PATH(sid||':'||serial#||':'||sql_id||':'||event||':'||p1||':'||p2, '->'), '->', ' -> ')
old 34: START WITH (ses.state='WAITING' AND ses.wait_class!='Idle') AND &2
new 34: START WITH (ses.state='WAITING' AND ses.wait_class!='Idle') AND 1=1
SESSIONS PATH
---------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 -> 254:11896:asyw0r1gaxchh:enq: TX - row lock contention:1415053316:196634
1 -> 41:1567:g9gsass4u3d7z:enq: TX - row lock contention:1415053318:262175
1 -> 41:1567:g9gsass4u3d7z:enq: TX - row lock contention:1415053318:262175 -> 254:11896:asyw0r1gaxchh:enq: TX - row lock contention:1415053316:196634 -> 237:4551:f1dckkc3aj43j:SQL*Net message from client:1650815232:1
1 -> 41:1567:g9gsass4u3d7z:enq: TX - row lock contention:1415053318:262175 -> 254:11896:asyw0r1gaxchh:enq: TX - row lock contention:1415053316:196634
1 -> 254:11896:asyw0r1gaxchh:enq: TX - row lock contention:1415053316:196634 -> 237:4551:f1dckkc3aj43j:SQL*Net message from client:1650815232:1
1 -> 35:61574:c93b0u0y4m43y:enq: TX - row lock contention:1415053318:196634 -> 237:4551:f1dckkc3aj43j:SQL*Net message from client:1650815232:1
1 -> 35:61574:c93b0u0y4m43y:enq: TX - row lock contention:1415053318:196634
7 rows selected.
SQL> select sql_id,sql_text from v$sql where sql_id in ('f1dckkc3aj43j','asyw0r1gaxchh','g9gsass4u3d7z','f1dckkc3aj43j','c93b0u0y4m43y');
SQL_ID SQL_TEXT
-------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
f1dckkc3aj43j UPDATE test_table SET name = 'NewName' WHERE name = 'Name1'
asyw0r1gaxchh UPDATE test_table SET name = 'NewName' WHERE name = 'Name2'
c93b0u0y4m43y SELECT * FROM test_table WHERE name = 'Name1' for update
g9gsass4u3d7z sELECT * FROM test_table WHERE name = 'Name2' for update
SQL> select * from v$lock where type in ('TM','TX') order by type;
ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK CON_ID
---------------- ---------------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ---------- ----------
00007FF0C6CE16E0 00007FF0C6CE1708 41 TM 76943 0 3 0 431 0 0
00007FF0C6CE16E0 00007FF0C6CE1708 254 TM 76943 0 3 0 441 0 0
00007FF0C6CE16E0 00007FF0C6CE1708 237 TM 76943 0 3 0 443 0 0
00007FF0C6CE16E0 00007FF0C6CE1708 35 TM 76943 0 3 0 440 0 0
000000007EF5B3A8 000000007EF5B3E0 254 TX 262175 2020 6 0 441 1 0
000000007EF39868 000000007EF398A0 237 TX 196634 2448 6 0 443 1 0
000000007D49C0D8 000000007D49C108 41 TX 262175 2020 0 6 431 0 0
000000007D49BF38 000000007D49BF68 254 TX 196634 2448 0 4 382 0 0
000000007D49BCC8 000000007D49BCF8 35 TX 196634 2448 0 6 440 0 0
9 rows selected.
SQL> select * from v$locked_object;
XIDUSN XIDSLOT XIDSQN OBJECT_ID SESSION_ID ORACLE_USERNAME OS_USER_NAME PROCESS LOCKED_MODE CON_ID
---------- ---------- ---------- ---------- ---------- ------------------------------ ------------------------------ ---------- ----------- ----------
0 0 0 76943 35 SYS oracle 7843 3 0
0 0 0 76943 41 SYS oracle 11893 3 0
3 26 2448 76943 237 SYS oracle 8108 3 0
4 31 2020 76943 254 SYS oracle 7650 3 0
锁定的对象还是76943,这次由237阻塞254,254阻塞41,237还阻塞35,
也就是g9gsass4u3d7z–>asyw0r1gaxchh–>f1dckkc3aj43j
四个会话都在76943对象上加了共享锁,254,237加了6级事物锁,237申请4级锁,35、41申请6级锁。
由于每次一行变化都要计算位图值,导致DML本身的性能下降,多个会话同时执行DML时会出现过度的TX锁争用。
commit 237号会话
SQL> @swc sid||':'||serial#||':'||sql_id||':'||event||':'||p1||':'||p2 1=1
old 5: REPLACE(SYS_CONNECT_BY_PATH(&1, '->'), '->', ' -> ')
new 5: REPLACE(SYS_CONNECT_BY_PATH(sid||':'||serial#||':'||sql_id||':'||event||':'||p1||':'||p2, '->'), '->', ' -> ')
old 34: START WITH (ses.state='WAITING' AND ses.wait_class!='Idle') AND &2
new 34: START WITH (ses.state='WAITING' AND ses.wait_class!='Idle') AND 1=1
SESSIONS PATH
---------- -----------------------------------------------------------------------
1 -> 41:1567:g9gsass4u3d7z:enq: TX - row lock contention:1415053318:262175 -> 254:11896:asyw0r1gaxchh:SQL*Net message from client:1650815232:1
1 -> 41:1567:g9gsass4u3d7z:enq: TX - row lock contention:1415053318:262175
[转帖]模拟enq: TX - row lock contention争用的更多相关文章
- ORACLE等待事件:enq: TX - row lock contention
enq: TX - row lock contention等待事件,这个是数据库里面一个比较常见的等待事件.enq是enqueue的缩写,它是一种保护共享资源的锁定机制,一个排队机制,先进先出(FIF ...
- 解决一则enq: TX – row lock contention的性能故障
上周二早上,收到项目组的一封邮件: 早上联代以下时间点用户有反馈EDI导入"假死",我们跟踪了EDI导入服务,服务是正常在跑,可能是处理的慢所以用户感觉是"假死" ...
- ORACLE AWR结合ASH诊断分析enq: TX - row lock contention
公司用户反馈一系统在14:00~15:00(2016-08-16)这个时间段反应比较慢,于是生成了这个时间段的AWR报告, 如上所示,通过Elapsed Time和DB Time对比分析,可以看出在这 ...
- Tuning “enq:TX – row lock contention” events
enq是一种保护共享资源的锁定机制,一个排队机制 排它机制从一个事务的第一次改变直到rollback or commit 结束这个事务, TX等待mode是6,当一个session 在一个表的行级锁定 ...
- 大表建立索引引发enq: TX - row lock contention等待
今天要给一张日志表(6000w数据)建立索引,导致生产系统行锁部分功能卡住 create index idx_tb_cid on tb_login_log(user_id); 开始执行后大概花费了20 ...
- enq: TX - row lock contention 参数P1,P2,P3说明
enq: TX - row lock contention三个参数,例如,下面的等待事件 * P1 = name|mode <<<<<<< ...
- 记录一则enq: TX - row lock contention的分析过程
故障描述:与客户沟通,初步确认故障范围大概是在上午的8:30-10:30之间,反应故障现象是Tomcat的连接数满导致应用无法连接,数据库alert中无明显报错,需要协助排查原因. 1.导入包含故障时 ...
- AWR之-enq TX - row lock contention的性能故障-转
1 对这一个小时进行AWR的收集和分析,首先,从报告头中看到DB Time达到近500分钟,(DB Time)/Elapsed=8,这个比值偏高: Snap Id Snap Time Sessio ...
- [Oracle] enq: TX - row lock contention 优化案例
依据开发反馈.近期每天早上7:30应用会报警.应用的日志显示数据库连接池满了.新的连接被拒绝. 首先.我做了ASH报告(报告区间:7:25 ~ 7:35),从ASH的等待事件发现enq: TX - r ...
- enq: TX - row lock contention“等待事件的处理
enq: TX - row lock contention“等待事件的处理 session1: SQL> conn scott/triger Connected. SQL> CRE ...
随机推荐
- C++产生N以内的随机整数
C++产生N(这里N=100)以内的随机整数的例子: #include <iostream> #include <ctime> using namespace std; int ...
- Midjourney 注册 12 步流程教学
原文: https://bysocket.com/midjourney-register/ 先推荐一个 PromptHero 中文官网 https://promptheroes.cn/ :Prompt ...
- 【DevCloud·敏捷智库】如何利用故事点做估算
背景 在某开发团队辅导的第二天,一个团队负责人咨询道:"领导经常管我要开发计划,我如何能快速的评估出预计开发完成时间呢,我们目前用工时估算,我听说过故事点估算,不知道适合吗?" 问 ...
- 3步带你搞定华为云编译构建CodeArts Build “新手村任务”
华为云编译构建(CodeArts Build)基于云端大规模并发加速,为客户提供高速.低成本.配置简单的混合语言构建能力,帮助客户缩短构建时间,提升构建效率. 本文将给各位开发者带来华为云CodeAr ...
- 华为云Astro的前世今生:用7年时间革新低代码开发观念
摘要:深扒华为云Astro低代码平台的前世今生,其成功之路显然是一条"个性"之路. 本文分享自华为云社区<华为云Astro的前世今生:用7年时间革新低代码开发观念>,作 ...
- 你知道,java项目中是如何获取文件地址的吗?
摘要:在java项目中我们经常会读取配置文件,但是文件的路径在获取时我们是怎么得到的?因为我总是忘记获取文件地址的方法,就在此记录一下 本文分享自华为云社区<[Java]Java项目的绝对地址和 ...
- cmd 7z 文件压缩
7z压缩测试 为了方便,将7z的安装目录,添加到环境变量中 # 不加环境变量的话,需要带上全路径 C:\Users\vipsoft>"C:\\Program Files\\7-Zip\ ...
- kubeadm init port is in use
前一次 init 时,master ip 写错了,导致init 失败,修改IP后再次执行时,报 kubeadm init 失败,port is in use Last login: Thu Oct 1 ...
- Spring EL 表达式
本篇讲述了Spring Expression Language -- 即Spring3中功能丰富强大的表达式语言,简称SpEL. SpEL是类似于OGNL和JSF EL的表达式语言,能够在运行时构建复 ...
- 数字孪生智慧物流之 Web GIS 地图应用
前言 随着数字经济时代的来临,新一轮全球化进程速度加快,在大数据.人工智能.物联网等高新技术深度融合下,加快催化智慧物流发展,引领物流行业划入全新时代. 从物流运输到货物分拣再到站点配送,图扑软件数据 ...