理解Oracle TM和TX锁
在Oracle中有很多锁,通过v$lock_type视图可以查看Oracle中所有类型的锁,
在本篇文章中我们熟悉一下TM和TX锁的类型
SQL> select * from v$lock_type where type in ('TM','TX');
TYPE NAME ID1_TAG ID2_TAG IS_USER DESCRIPTION
-------- --------------- ------------------ ------------------- ------- --------------------------------------------------------------------------------
TM DML object # table/partition YES Synchronizes accesses to an object
TX Transaction usn<< | slot sequence YES Lock held by a transaction to allow other transactions to wait for it
在v$lock_type视图中可以看到对TM和TX锁的描述,TM为DML锁,TX锁是事务锁,我们知道数据库中的数据有元数据和数据,
其中元数据就是表的本身,而数据就是指表里的数据,那么TM锁保护的就是元数据,TX锁保护的就是一般意义上的数据
我们知道当truncate一张大表和truncate一张小表所花费的时间是没有差异的,原因在于Oracle在处理的时候只在删除了元数据,
而没有真正删除表里的数据,所以会很快且和表的大小无关。
通过v$lock_type可以看到
TM锁中ID1_TAG表示的是一个对象号,ID2_TAG表示的是一个对象类型,是一个表还是分区
TX锁中ID1_TAG和ID2_TAG联合起来表示的是一个事务ID(如何根据这两列算出事务ID?待续)
通过例子学习TM/TX锁
--预先创建一张表
SQL> create table test(id int,name varchar2()); Table created SQL> insert into test values(,'beijing'); row inserted SQL> commit; Commit complete
--更新一下
SQL> update test set name='shanghai' where id=; row updated
这次更新会在TEST表元数据上加上TM锁,在TEST数据上加上TX锁
SQL> select distinct sid from v$mystat;
SID
----------
SQL> select * from v$lock where sid=;
ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK
-------- -------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------
4335184C TM
4339B56C 4339B590 TX
可以看到TM和TX锁,通过以上知道TM锁的ID1表示OBJECT#,
SQL> select object_name,object_type from dba_objects where object_id=; OBJECT_NAME OBJECT_TYPE
--------------- -------------------
TEST TABLE
TX锁的ID1和ID2表示了一个事务ID,通过相应的计算能够得到事务ID,我们可以查询v$transaction
SQL> select * from v$transaction; ADDR XIDUSN XIDSLOT XIDSQN UBAFIL UBABLK UBASQN UBAREC STATUS ....... XID PRV_XID PTX_XID
-------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------- ---------------- ---------------- ----------------
4339B56C ACTIVE 07002A0055010000
总结:
1.查询不需要锁
2.加在行上锁的一定是排他锁 exclusive (row)
3.加在表上的锁最为复杂,可分为以下几种类型 metadata (table) --也就是指v$lock表上lmode 2,3,4,5,6
4.要想锁定行首先锁定他的元数据
---开启另一会更改相同的数据观察v$lock
SQL> select distinct sid from v$mystat;
SID
----------
SQL> update test set name='guangzhou' where id=;
会发现142会话被阻塞,
SQL> select * from v$lock where sid in (,); ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK
-------- -------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------
TX
4335184C TM
433518F8 TM
4339B56C 4339B590 TX
发现v$lock视图153会话BLOCK为1,这就表示153会话阻塞了别的会话,可以看到142会话在请求一个REQUEST 6 的锁,
因为我们这是模拟的阻塞,我们知道153的会话阻塞了142的会话,可以看到153和142的ID1/ID2所请求或持有的资源
是一样的,从这也可判断153阻塞了142的会话
--查询session
SQL> select * from v$session where sid in (,); SADDR SID SERIAL# AUDSID PADDR USER# USERNAME COMMAND OWNERID TADDR LOCKWAIT STATUS SERVER SCHEMA# SCHEMANAME OSUSER PROCESS MACHINE TERMINAL PROGRAM TYPE SQL_ADDRESS SQL_HASH_VALUE SQL_ID SQL_CHILD_NUMBER PREV_SQL_ADDR PREV_HASH_VALUE PREV_SQL_ID PREV_CHILD_NUMBER PLSQL_ENTRY_OBJECT_ID PLSQL_ENTRY_SUBPROGRAM_ID PLSQL_OBJECT_ID PLSQL_SUBPROGRAM_ID MODULE MODULE_HASH ACTION ACTION_HASH CLIENT_INFO FIXED_TABLE_SEQUENCE ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW# LOGON_TIME LAST_CALL_ET PDML_ENABLED FAILOVER_TYPE FAILOVER_METHOD FAILED_OVER RESOURCE_CONSUMER_GROUP PDML_STATUS PDDL_STATUS PQ_STATUS CURRENT_QUEUE_DURATION CLIENT_IDENTIFIER BLOCKING_SESSION_STATUS BLOCKING_INSTANCE BLOCKING_SESSION SEQ# EVENT# EVENT P1TEXT P1 P1RAW P2TEXT P2 P2RAW P3TEXT P3 P3RAW WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS WAIT_TIME SECONDS_IN_WAIT STATE SERVICE_NAME SQL_TRACE SQL_TRACE_WAITS SQL_TRACE_BINDS
-------- ---------- ---------- ---------- -------- ---------- ------------------------------ ---------- ---------- -------- -------- -------- --------- ---------- ------------------------------ ------------------------------ ------------ ---------------------------------------------------------------- ------------------------------ ------------------------------------------------ ---------- ----------- -------------- ------------- ---------------- ------------- --------------- ------------- ----------------- --------------------- ------------------------- --------------- ------------------- ------------------------------------------------ ----------- -------------------------------- ----------- ---------------------------------------------------------------- -------------------- ------------- -------------- --------------- ------------- ----------- ------------ ------------ ------------- --------------- ----------- -------------------------------- ----------- ----------- --------- ---------------------- ---------------------------------------------------------------- ----------------------- ----------------- ---------------- ---------- ---------- ---------------------------------------------------------------- ---------------------------------------------------------------- ---------- -------- ---------------------------------------------------------------- ---------- -------- ---------------------------------------------------------------- ---------- -------- ------------- ----------- ---------------------------------------------------------------- ---------- --------------- ------------------- ---------------------------------------------------------------- --------- --------------- ---------------
44226F64 SYS 43395CA0 ACTIVE DEDICATED SYS livan : WORKGROUP\LENOVO-PC LENOVO-PC plsqldev.exe USER 401CE71C 28tf955dakfkp 403E63FC 9m7787camwh4m PL/SQL Developer 命令窗口 - 新建 // NO NONE NONE NO DISABLED ENABLED ENABLED VALID enq: TX - row lock contention name|mode usn<< | slot 0007002A sequence Application WAITING ZDJS DISABLED FALSE FALSE
4431717C 442263EC SYS 4339B56C INACTIVE DEDICATED SYS livan : WORKGROUP\LENOVO-PC LENOVO-PC plsqldev.exe USER 403E63FC 9m7787camwh4m PL/SQL Developer 命令窗口 - 新建 // NO NONE NONE NO DISABLED ENABLED ENABLED NO HOLDER SQL*Net message from client driver id #bytes Idle WAITING ZDJS DISABLED FALSE FALSE
可以看到v$session中有一个LOCKWAIT列,改列就对应到了v$lock视图的KADDR ,其中V$LOCK中的ADDR对应到v$transaction中的ADDR找到对应的session信息,可以通过v$session中的SQL_ID找到对应的SQL
SQL> select sql_text from v$sql where sql_id='28tf955dakfkp'; SQL_TEXT
--------------------------------------------------------------------------------
update test set name='guangzhou' where id=
可以看到哪个到底哪个语句被阻塞了
在v$session中可以142会话BLOCKING_SESSION_STATUS列为VALID,这也说明该会话被阻塞了,BLOCKING_SESSION列说名阻塞他的到底是哪个会话,BLOCKING_INSTANCE表示阻塞发生哪个实例
通过v$session的ROW_WAIT_OBJ#,ROW_WAIT_FILE#, ROW_WAIT_BLOCK#, ROW_WAIT_ROW#就可以求出一个ROWID,有了ROWID就知道了修改哪条数据了
SQL> select dbms_rowid.rowid_create(,ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#)
from v$session where sid=; DBMS_ROWID.ROWID_CREATE(,ROW_
------------------------------
AAANWHAABAAAOjSAAA
根据这个rowid可以求出是哪条数据:
SQL> select * from test where rowid='AAANWHAABAAAOjSAAA';
ID NAME
--------------------------------------- ------------------------------
beijing
lock 保护数据库对象
latch 闩 :保护的内存结构,凡是有共享的地方都有lock或latch 在同一时刻绝对是串行修改
理解Oracle TM和TX锁的更多相关文章
- Oracle关于TX锁的一个有趣的问题
前阵子有一个网友在群里问了一个关于Oracle数据库的TX锁问题,问题原文如下: 请教一个问题: 两个会话执行不同的delete语句,结果都是删除同一个行.先执行的会话里where条件不加索引走全表扫 ...
- (转)DB2和 Oracle的并发控制(锁)比较
DB2和 Oracle的并发控制(锁)比较 牛 新庄2005 年 12 月 26 日发布 原文:https://www.ibm.com/developerworks/cn/data/library/t ...
- Oracle TM锁和TX锁
CREATE TABLE "TEST6" ( "ID" ), "NAME" ), "AGE" ,), "SEX ...
- 深入理解Oracle RAC 12c 笔记
深入理解Oracle RAC 12c 跳转至: 导航. 搜索 文件夹 1 概述 2 集群件管理和故障诊断 3 执行实践 4 新特性 5 存储和ASM 6 应用设计上的问题 7 管理和调优一个复杂的RA ...
- Oracle事务之一:锁和隔离
Oracle事务之一:锁和隔离 一. 事务概述 事务管理是数据库处理的核心.数据库既要保证用户能并发地执行事务,还要保证数据库的一致性. 当第一条可执行的SQL开始执行,就隐形地开始了一个事务,直到遇 ...
- oracle之事务和锁
Oracle的事务和锁(PPT-I-283-293) 10.1 什么是事务 必须具备以下四个属性,简称ACID 属性:原子性(Atomicity): 事务是一个完整的操作.事务的各步操作是不可分的( ...
- [Oracle]TM lock (DML enqueue) 的相容性
[Oracle]TM lock (DML enqueue) 的相容性 RS(SS): 行共享 LMODE =2 RX(SX): 行独占 LMODE =3 S: 共享 ...
- 未发现oracle(tm)客户端和网络组件
环境:Win7 64位.Oracle 11g 64位.PowerDesigner16.5.instant client12_1 64位. 在用PowerDesigner逆向数据库结构时,配置Oracl ...
- 如何理解oracle 11g scan ip
如何理解oracle 11g scan ip 在11.2之前,client链接数据库的时候要用vip,假如你的cluster有4个节点,那么客户端的tnsnames.ora中就对应有四个主机vip ...
随机推荐
- 启动Tomcat服务器报错: Several ports (8005, 8080, 8009) required
错误记录--更改tomcat端口号方法,Several ports (8005, 8080, 8009) http://blog.csdn.net/xinxin19881112/article/det ...
- input上下居中问题
IE:不管该行有没有文字,光标高度与font-size一致.FF:该行有文字时,光标高度与font-size一致.该行无文字时,光标高度与input的height一致.Chrome:该行无文字时,光标 ...
- T-SQL Transact-SQL 编程
T-SQL语句用于管理SQL Server数据库引擎实例,创建和管理数据库对象,以及查询.插入.修改和删除数据. Ø 变量 . 局部变量(Local Variable) 局部变量是用户可以自定义的变量 ...
- HTTP协议开发应用-HTTP&XML协议栈开发
Netty HTTP+XML协议栈开发 由于HTTP协议的通用性,很多异构系统间的通信交互采用HTTP协议,通过HTTP协议承载业务数据进行消息交互,例如非常流行的HTTP+XML或者RESTful+ ...
- express-6 请求和响应对象(1)
URL的组成部分 协议: 协议确定如何传输请求.我们主要是处理http和https.其他常见的协议还有file和ftp. 主机名: 主机名标识服务器.运行在本地计算机(localhost)和本地网络的 ...
- tomcat 部署spring工程乱码解决方案
tomcat的server.xml文件,Connector标签增加useBodyEncodingForURI="true"属性 web.xml如下配置 <filter> ...
- Codeforces 629C Famil Door and Brackets(DP)
题目大概说给一个长m的括号序列s,要在其前面和后面添加括号使其变为合法的长度n的括号序列,p+s+q,问有几种方式.(合法的括号序列当且仅当左括号总数等于右括号总数且任何一个前缀左括号数大于等于右括号 ...
- POJ1637 Sightseeing tour(判定混合图欧拉回路)
有向连通图存在欧拉回路的充要条件是所有点入度=出度. 首先随便给定所有无向边一个方向(不妨直接是u->v方向),记录所有点的度(记:度=入度-出度). 这时如果有点的度不等于0,那么就不存在欧拉 ...
- 【oracle】解锁oracle用户,unlock
解除oracle用户的锁定状态,例如oracle数据库建立测试实例时默认建立的scott用户,一开始是处于locked状态的,现在我们需要将其解锁,步骤如下: (1)在cmd中登录sqlplus,例如 ...
- Hive0.11安装配置学习笔记
转:http://springsfeng.iteye.com/blog/1734517 1 . 首先请安装好MySQL并修改root账户密码,使用root账户执行下面命令: su - root ...