Oracle中TX

一、问题现象:

ORACLE OEM巡检发现某时段存在较大的WAITTING事件(如图1的红色部分):

(图1:Database Activity)

其实发现这个问题还可以从v$locked_object、AWR中发现,但要数最直观的还是OEM的ACTIVESESSIONS视图。

二、问题分析:

1、为了定位事件,采集该时段的ADDM快照(如图2:开始PM4,结束PM7):

(图2:Database Activity)

2、直奔主题SQL statements were found waiting for row lock waits(如图3)

(图3:SQL statements were found waiting for row lock waits)

通过“Wait class "Application" was consuming significant database time”我们分析由于应用程序的问题导致enq: TX - row lock contention。再看SQL语句,基本判断是由于未COMMIT导致。

TX锁通常被称为事务锁,当一个事务开始时,如执行INSERT/DELETE/UPDATE/MERGE等操作或者使用SELECT ... FOR UPDATE语句进行查询时,会首先获取事务锁,直到该事务结束。Oracle的TX锁定是在行级获得的,每个数据行上都存在一个锁定位(1b-Lock Byte),用于判断该记录是否被锁定,同时在每个数据块的头部(Header)存在一个ITL的数据结构,用于记录事务信息等,当需要修改数据时,首先需要获得回滚段空间用于存储前镜像信息,然后这个事务信息同样被记录在ITL上,通过ITL可以将回滚信息和数据块关联起来,所以说Oracle的行级锁定是在数据块上获得的,行级锁只有排他锁没有共享模式。

时间: 2024-09-30 22:15:25

Oracle中TX的相关文章

Oracle中的锁(LOCK)机制

 本文结合示例简要的介绍了一下Oracle中锁的机制. 为了解决多用户环境下并发操作相同的资源而造成的错误修改数据的问题.单用户环境下不需要考虑锁,因为所有操作都是串行的.下面的文章简要的介绍了一下 锁的分类异常复杂,enqueue.latch.mutex等,都是为了解决并发存在的,自己也有些混乱,所以也不过多解释了.下面列举一些对于lock的要点内容. l 排他锁: 不允许相关的资源被共享.一个资源在一个时间点内只有一个事务能够获取该资源的排他锁,只有持有该锁的事务能够修改相关的资源, 其他想

ORACLE中死锁的知识点总结

  死锁的概念       什么是死锁呢? 其实我们生活中也有很多类似死锁的例子. 我先举一个生活中的例子:过年回家,父亲买了一把水弹枪,儿子和侄子争抢着要先玩,谁也不让谁,拆开包装后,一个抢了枪, 一个逮住了子弹和弹夹.两个都争着要先玩,但是都互不相让.结果两个人都玩不了.如果儿子要先玩,就必须让侄子把子弹和弹夹给他,如果侄子要先玩,就必须让儿子把枪给侄子.他们就这样对峙了十几分钟,互不相让. 我出来调停,让儿子把枪先给侄子玩,每个人玩十分钟.然后两个人开开心心一起玩起来.其实这就是一个活生生

全面解析oracle中的锁机制3

5.TX事务锁和 TM(DML enqueue)锁: TX锁:数据块的前面有一个开销空间(ITL),这里会存放一个块的事务列表,对于每一个锁定了块的事务,都会在这个事务列表中有一个条目.这个结构的大小有创建对象时的两个参数决定: INITRANS:初始分配的可容纳事务的大小,一般初始为2,可以说是事务槽. MAXTRANS:这个结构可以扩缩到的最大大小.它默认为255,在实际中,最小值为2.在Oracle10g 中,这个设置已经废弃了,所以不再使用.这个版本中的MAXTRANS 总是255.  

oracle 中使用一列想存4000汉字如何做到?

问题描述 一列Clob如何存储4000汉字 解决方案 解决方案二:好文,mark解决方案三:存不了吧如果很大的话只能存文件路径要看的时候再下载解决方案四:你把这些字写到一个文件里边,再用输入输出流写入数据库里边!解决方案五:lob最大不是能存4G么解决方案六:是受insert语句限制吧解决方案七:学习当中!!!!解决方案八:看完就明白了:oracle官方文档CLOB10goracle官方文件LOBsample解决方案九:大字段,bolb解决方案十:CLOB解决方案十一:大字段够大了解决方案十二:

oracle的TX lock信息在哪里?

而 我们都知道ORACLE不会发生锁升级,锁对于ORACLE来说并不是稀缺资源,为什么DML lock对于ORACLE来说不是稀缺资源,下面来寻找答案. SQL> select * from emp where sal>2999; EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO ----- ---------- --------- ----- ----------- --------- ------

关于java判断oracle中的表是否存在,不存在则创建一个表的问题

问题描述 关于java判断oracle中的表是否存在,不存在则创建一个表的问题 代码如下try{ Class.forName(""oracle.jdbc.driver.OracleDriver""); String url = ""jdbc:oracle:thin:@""+localhost+"":""+port+"":""+dbname; con

用sqoop将oracle中的表导入hadoop出现如图问题 求解决方案!

问题描述 用sqoop将oracle中的表导入hadoop出现如图问题 求解决方案! 解决方案 http://www.linuxidc.com/Linux/2014-02/96678.htm 照这个链接再搞一下 解决方案二: 我当初就是照他的方案弄得 不知道为什么连接不上去

在Oracle中计算时间差的方法

如何在Oracle中计算时间差呢?计算时间差是Oracle DATA数据类型的一个常见问题.Oracle支持日期计算,你可以创建诸如"日期1-日期2"这样的表达式来计算这两个日期之间的时间差. 一旦你发现了时间差异,你可以使用简单的技巧来以天.小时.分钟或者秒为单位来计算时间差.为了得到数据差,你必须选择合适的时间度量单位,这样就可以进行数据格式隐藏. 使用完善复杂的转换函数来转换日期是一个诱惑,但是你会发现这不是最好的解决方法. round(to_number(end-date-st

在ORACLE中移动数据库文件

在ORACLE中移动数据库文件 ---- ORACLE数据库由数据文件,控制文件和联机日志文件三种文件组成.由于磁盘空间的变化,或者基于数据库磁盘I/O性能的调整等,数据库管理员可能会考虑移动数据库文件.下面以UNIX平台为例,分别讨论三种数据库文件的移动方法. ---- 一.移动数据文件: ---- 可以用ALTER DATABASE,ALTER TABLESPACE两种方法移动数据文件. ---- 1. ALTER DATABASE方法: ---- 用此方法,可以移动任何表空间的数据文件.