[转帖]事务上的等待事件 —— enq: TM - contention

事务,等待,事件,enq,tm,contention · 浏览次数 : 0

小编点评

**DML锁争用** 执行 DML 操作时,对表进行 TM锁以防止并发修改。如果在获得 TM锁的过程中发生冲突,则等待 **enq: HW - contention** 事件。 **DML锁类型** * **data lock**:用于保护数据。 * **table lock**:用于保护整个表。 **DML锁争用情况** 1. **不当的 DDL 指令**导致 TM锁争用,因为 DDL 操作不是事务性的,可能导致多个会话竞争获取锁。 2. **利用 Lock 表**主动获取 TM锁时,如果并发执行,也会出现 TM锁争用。 3. **Direct/Parallel Load**工作在执行 DML 时,以 Exclusive 模式获取 TM锁,但无法处理并发修改。 4. **SQL*Loader** 中的某些操作,如 **APPEND** 和 **LOAD DATA INPATH**,可能导致 TM锁争用。 **解决方案** * 使用 **online**选项执行 DML。 * **利用 Lock table** 中的 **Lock wait stats** 来监控锁争用。 * 在执行 DML 操作时,确认 TM锁争用是否可能引发问题。

正文

执行DML期间,为防止对与DML相关的对象进行修改,执行DML的进程必须对该表获得TM锁。若在获得TM锁的过程中发生争用,则等待enq: HW - contention 事件。

  1. SQL> select name,parameter1,parameter2,parameter3 from v$event_name where name like 'enq: TM - contention';
  2. NAME PARAMETER1 PARAMETER2 PARAMETER3
  3. ------------------------------ -------------------- -------------------- --------------------
  4. enq: TM - contention name|mode object # table/partition

注意:可能大家以为存在DML锁和DDL锁这两个锁,实际上,DML锁和DDL锁只是为了合理分配锁而赋予的名称。
DML锁:data lock。执行DML时保护数据的锁。Row Lock(TX)保护特定行,Table Lock(TM)保护整个表,可以通过dba_dml_locks观察。这个视图的作用是从v$lock视图上筛选出锁类型为TM的。数据库上允许的TM锁数量,可以利用dml_locks参数指定。

DDL锁:data dictionary lock。保护User/Table/View/Procedure等定义,可以通过dba_ddl_locks观察。

 

一般发生TM锁争用的情况如下:

1、不当的DDL引起的TM锁争用

 对于事务正运行的表,基本上不可能执行DDL。因此这时不会发生争用引起的性能问题。对于已经完成update但还没有提交的表,不可能执行DDL。相反,对于正在执行DDL的表执行DML时,可能发生TM锁争用。
若对于数据多的表执行不当的DDL,则访问此表的所有DML会话都会陷入等待状态,可能发展至故障状态。通过合理的管理,从根本上防止才是最好的方法。
执行DDL时,最好使用online选项。随着oracle版本升级,online状态下可执行的DDL逐步增加。
使用parallel DDL将DDL的执行速度最大化。对拥有大量数据的表执行DDL时,若恰当使用parallel选项,可将DDL本身性能最大化,而且同时使用nologging选项也比较好。

 

2、利用Lock table ...主动获取TM锁时

利用Lock table ...语句有意获取TM锁时可能发生TM锁争用。发生TM锁引起的争用,收集锁拥有着在会话上执行的SQL语句尤为重要。

 

3、执行Direct/Parallel Load工作时

INSERT /*+ APPEND */ INTO ...或SQL*Loader的direct path load之类的部分功能,对于相应的表以Exclusive模式获得TM锁。Direct load工作不经过SGA,而是直接写入到数据文件里,所以在执行工作期间不允许对表进行任何修改。Direct load工作在执行工作期间,不允许对于表任何DDL或DML。因此,事务多的时刻执行Direct load工作时,需要确认TM锁争用是否可能引发问题。将SQL*Loader利用Parallel模式执行时,对表以Shared模式获取TM锁。因此,此种情况下也不会允许其它会话上的DDL或DML。

文章知识点与官方知识档案匹配,可进一步学习相关知识
MySQL入门技能树SQL高级技巧事务67271 人正在系统学习中

与[转帖]事务上的等待事件 —— enq: TM - contention相似的内容:

[转帖]事务上的等待事件 —— enq: TM - contention

执行DML期间,为防止对与DML相关的对象进行修改,执行DML的进程必须对该表获得TM锁。若在获得TM锁的过程中发生争用,则等待enq: HW - contention 事件。 SQL> select name,parameter1,parameter2,parameter3 from v$even

[转帖]事务上的等待事件 —— enq: TX - contention

TX锁是保护事务的,事务结束时便会释放。因此,为获得TX锁为等待的会话,要等到拥有锁的会话的事务结束为止。 SQL> select name,parameter1,parameter2,parameter3 from v$event_name where name like '%enq: TX%';

[转帖]模拟enq: TX - row lock contention争用

https://www.modb.pro/db/623036 enq: TX - row lock contention它表示一个事务正在等待另一个事务释放被锁定的行。这种等待事件通常发生在并发访问数据库时,多个事务试图同时修改同一行数据时会发生行级锁争用。 以下是可能导致 “enq: TX - r

[转帖]超详细的I/O多路复用概念、常用I/O模型、系统调用等介绍

概述 当我们要编写一个echo服务器程序的时候,需要对用户从标准输入键入的交互命令做出响应。在这种情况下,服务器必须响应两个相互独立的I/O事件:1)网络客户端发起网络连接请求,2)用户在键盘上键入命令行。我们先等待哪个事件呢?没有哪个选择是理想的。如果在acceptor中等待一个连接请求,我们就不

[转帖]深入学习MySQL事务:ACID特性的实现原理

https://www.cnblogs.com/kismetv/p/10331633.html 事务是MySQL等关系型数据库区别于NoSQL的重要方面,是保证数据一致性的重要手段。本文将首先介绍MySQL事务相关的基础概念,然后介绍事务的ACID特性,并分析其实现原理。 MySQL博大精深,文章疏

[转帖]MySQL InnoDB存储引擎大观

https://baijiahao.baidu.com/s?id=1709263187856706948&wfr=spider&for=pc MySQL InnoDB 引擎现在广为使用,它提供了事务,行锁,日志等一系列特性,本文分析下 InnoDB的内部实现机制,MySQL 版本为 5.7.24,操

[转帖]Percolator分布式事务模型原理与应用

https://zhuanlan.zhihu.com/p/59115828 Percolator 模型 Percolator[1] 是 Google 发表在 OSDI‘2010 上的论文 Large-scale Incremental Processing Using Distributed Tra

[转帖]Oracle中INITRANS和MAXTRANS参数

每个块都有一个块首部。这个块首部中有一个事务表。事务表中会建立一些条目来描述哪些事务将块上的哪些行/元素锁定。这个事务表的初始大小由对象的INITRANS 设置指定。对于表,这个值默认为2(索引的INITRANS 也默认为2)。事务表会根据需要动态扩展,最大达到MAXTRANS 个条目(假设块上有足

[转帖]Percolator 和 TiDB 事务算法

https://cn.pingcap.com/blog/percolator-and-txn 本文先概括的讲一下 Google Percolator 的大致流程。Percolator 是 Google 的上一代分布式事务解决方案,构建在 BigTable 之上,在 Google 内部 用于网页索引更

[转帖]create table INITRANS参数分析

https://www.modb.pro/db/44701 1. 内容介绍 Oracle数据库create table时使用INITRANS参数设置数据块ITL事务槽的数量,确保该数据块上 并发事务数量。参数内容总结如下, 1. Oracle 8K blocksize 数据块初始 2个itl,8K