在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锁的更多相关文章

  1. Oracle关于TX锁的一个有趣的问题

    前阵子有一个网友在群里问了一个关于Oracle数据库的TX锁问题,问题原文如下: 请教一个问题: 两个会话执行不同的delete语句,结果都是删除同一个行.先执行的会话里where条件不加索引走全表扫 ...

  2. (转)DB2和 Oracle的并发控制(锁)比较

    DB2和 Oracle的并发控制(锁)比较 牛 新庄2005 年 12 月 26 日发布 原文:https://www.ibm.com/developerworks/cn/data/library/t ...

  3. Oracle TM锁和TX锁

    CREATE TABLE "TEST6" ( "ID" ), "NAME" ), "AGE" ,), "SEX ...

  4. 深入理解Oracle RAC 12c 笔记

    深入理解Oracle RAC 12c 跳转至: 导航. 搜索 文件夹 1 概述 2 集群件管理和故障诊断 3 执行实践 4 新特性 5 存储和ASM 6 应用设计上的问题 7 管理和调优一个复杂的RA ...

  5. Oracle事务之一:锁和隔离

    Oracle事务之一:锁和隔离 一. 事务概述 事务管理是数据库处理的核心.数据库既要保证用户能并发地执行事务,还要保证数据库的一致性. 当第一条可执行的SQL开始执行,就隐形地开始了一个事务,直到遇 ...

  6. oracle之事务和锁

    Oracle的事务和锁(PPT-I-283-293) 10.1 什么是事务 必须具备以下四个属性,简称ACID 属性:原子性(Atomicity):  事务是一个完整的操作.事务的各步操作是不可分的( ...

  7. [Oracle]TM lock (DML enqueue) 的相容性

    [Oracle]TM lock (DML enqueue) 的相容性 RS(SS):  行共享     LMODE =2 RX(SX):  行独占     LMODE =3 S:       共享   ...

  8. 未发现oracle(tm)客户端和网络组件

    环境:Win7 64位.Oracle 11g 64位.PowerDesigner16.5.instant client12_1 64位. 在用PowerDesigner逆向数据库结构时,配置Oracl ...

  9. 如何理解oracle 11g scan ip

    如何理解oracle 11g scan ip   在11.2之前,client链接数据库的时候要用vip,假如你的cluster有4个节点,那么客户端的tnsnames.ora中就对应有四个主机vip ...

随机推荐

  1. LoadRunner 一些快捷键

    F4   Runtime Setting F5   运行 Ctrl Alt C  注释 Ctrl Alt U  取消注释 Tab  缩进 Shift Tab  取消缩进 Ctrl L  打开参数管理对 ...

  2. HDU 2609 最小表示法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2609 题意:给定n个循环链[串],问有多少个本质不同的链[串](如果一个循环链可以通过找一个起点使得和 ...

  3. iOS10 UI教程基改变视图的外观与视图的可见性

    iOS10 UI教程基改变视图的外观与视图的可见性 视图是应用程序的界面,是用户在屏幕上看到的对象.用户可以通过触摸视图上的对象与应用程序进行交互,所以视图界面的优劣会直接影响到了客户体验的好坏.和视 ...

  4. WPF,解决Listbox,按住ListboxItem向下拖出Listbox,横向滚动条跑到最后。

    类似这种样式的控件,.,在横向滚动条隐藏的情况下有这样的问题.(横向滚动条显示的时候也会,,目前不知道怎么解决.) 因为这个控件偏移是利用ListBox的ItemsPanelTemplate模版里的S ...

  5. Drawing Arc Using ArcSegment in XAML

    We can use the Arc XAML element to draw arcs in XAML. Besides drawing arcs using the Arc element, we ...

  6. 关于Div的宽度与高度的100%设定

    http://www.cnblogs.com/clare-zhang/archive/2011/08/26/2154220.html 正像你所知道的那样,设置DIV大小的有两个属性width和heig ...

  7. Codeforces Round #364 (Div. 2) B. Cells Not Under Attack

    B. Cells Not Under Attack time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  8. jquery.cookie.js使用

    1.下载jquery.cookie.js 官网:http://plugins.jquery.com/cookie/ 或 http://pan.baidu.com/s/1mgynA8g 2.使用方法 $ ...

  9. [深入浅出Windows 10]应用实战:Bing在线壁纸

    本章介绍一个使用Bing搜索引擎背景图接口实现的一个应用——Bing在线壁纸,讲解如何使用网络的接口来实现一个壁纸下载,壁纸列表展示和网络请求封装的内容.通过该例子我们可以学习到如何使用网络编程的知识 ...

  10. SRM 615 DIV1 500

    TC 都615了...时间过的真快啊. 第一次做出500分,心情还是很激动的,虽然看了很久的题解,TC官网上的题解,很详细,但是英语的...我搜了搜,发现一份日语的...好吧,我还是看看英语的吧... ...