理解oracle锁和闩(3)TX锁和TM锁

oracle没有锁管理器和锁列表,这样可以避免行级锁维护的开销和行级锁数量不足导致的争用问题。在Oracle的每行数据上,都有一个标志位来表示该行数据是否被锁定,要查看某一行是否被锁定,必须直接找到这一行,而不要指望能从哪个列表得到答案,事务只是找到数据。其locking过程如下:

㈠ 找到想锁定的那一行的地址

㈡ 到达那一行

㈢ 锁定这一行

在这行的位置,而非某个锁列表。如果这一行已经锁定,则等待锁定它的事务结束,除非使用nowait选项。

保护元数据---->TM锁(表级锁)

保护数据 ---->TX锁(事务锁)

v$lock列:ID1、ID2

对TM锁,ID1表示被locking对象的object_id,ID2始终为0

对TX锁,ID1表示该事务的xidusn、xidslot,ID2表示xidsqn

对ID1的拆解:

14:14:56 hr@ORCL (^ω^) select id1,id2,type from v$lock where type='TX';

 ID1    ID2 TYPE

---------- ---------- ----

524320    1748 TX

14:16:56 hr@ORCL (^ω^) select 524320/65536 xidusn,mod(524320,65536) xidslot from dual;

XIDUSN  XIDSLOT

---------- ----------

8.00048828     32

事务锁不是行级锁。行级锁触发事务锁。一个事务只有一个事务锁,但可以有多个行级锁。TX锁用作一种排队机制:请求锁的事务会排队,等待目前持有锁的事务执行,然后得到数据。

事务中DML或select ...for update都会得到一个TX锁。

session 1:scott

SQL> update dept set dname=initcap(dname);

已更新4行。

SQL> select username,l.sid,trunc(id1/power(2,16)) xidusn,bitand(id1,to_number('ffff','xxxx'))+0 slot,

2     id2 sqn,lmode,request

3  from v$lock l,v$session s

4  where l.type='TX' and

5     l.sid=s.sid and

6     s.username=USER

7 /

USERNAME     SID   XIDUSN    SLOT    SQN   LMODE  REQUEST

---------- ---------- ---------- ---------- ---------- ---------- ----------

SCOTT       154     10     40    1395     6     0

SQL> select xidusn,xidslot,xidsqn from v$transaction;

XIDUSN  XIDSLOT   XIDSQN

---------- ---------- ----------

10     40    1395

注释:

① v$lock表中lmode=6为X锁(排他表级锁)。request=0则意味着你拥有这个锁

② oracle不会在任何地方存储行级锁列表。所以v$lock表只有一行,而不是四行

session 2:也是scott

SQL> update emp set ename=upper(ename);

已更新14行。

SQL> update dept set deptno=deptno-10;

现在会话被阻塞。

SQL> select username,l.sid,trunc(id1/power(2,16)) xidusn,bitand(id1,to_number('ffff','xxxx'))+0 slot,

2      id2 sqn,lmode,request

3  from v$lock l,v$session s

4  where  l.type='TX' and

5      l.sid=s.sid and

6      s.username=USER

7 /

USERNAME     SID   XIDUSN    SLOT    SQN   LMODE  REQUEST

---------- ---------- ---------- ---------- ---------- ---------- ----------

SCOTT       135     10     40    1395     0     6

SCOTT       135     2     1    1777     6     0

SCOTT       154     10     40    1395     6     0

SQL> select xidusn,xidslot,xidsqn from v$transaction;

XIDUSN  XIDSLOT   XIDSQN

---------- ---------- ----------

  2     1    1777

 10     40    1395

这里可以看到一个新的事务,xid为(2,1,1777)。request=6表明对一个X锁的请求。请求行的xid正是持有

者的事务ID。

SQL> select (select username from v$session where sid=a.sid) blocker,a.sid,

2     'is blocking',

3     (select username from v$session where sid=b.sid) blockee,b.sid

4  from v$lock a,v$lock b

5  where a.block=1 and

6     b.request>0 and

7     a.id1=b.id1 and

8     a.id2=b.id2

9 /

BLOCKER      SID 'ISBLOCKING'      BLOCKEE     SID

---------- ---------- ---------------------- -------- ----------

SCOTT       154 is blocking      SCOTT      135

表级锁(table-level lock)的作用是对并发的 DDL 操作进行访问控制,例如防止在 DML 语句执行期间相关的表被移除。当用户对表执行 DDL 或 DML 操作时,将获取一个此表的表级锁。表级锁不会影响其他并发的 DML 操作。对于分区表来说,表级锁既可以针对整个表,也可以只针对某个分区。

当用户执行以下 DML 语句对表进行修改:INSERT,UPDATE,DELETE,及 SELECT ... FOR UPDATE,或执行 LOCK TABLE 语句时,事务将获取一个表级锁。当一个未提交的事务拥有某个表上的锁时,此表就无法被修改定义或被移除。

大家都知道TM锁共有6种模式,最常见的是3(插入,更新,删除);4(创建索引时);5(部分DDL操作如:删除列)等等

RS

行共享表级锁(row share table lock)(也称为 subshare table lock,SS)表明拥有此锁的事务已经锁定了表内的 某些数据行,并有意对数据行进行更新操作。当执行以下 SQL 语句时将获得表上的行共享表级锁:

SELECT ... FROM table ... FOR UPDATE OF ... ;

OR

LOCK TABLE table IN ROW SHARE MODE;

RS限制程度最低,因而能够保证表的最大的并发访问能力

查看本栏目更多精彩内容:http://www.bianceng.cn/database/Oracle/

时间: 2024-09-19 02:54:00

理解oracle锁和闩(3)TX锁和TM锁的相关文章

oracle 数据库锁类型 TM锁和TX锁

问题描述 oracle 数据库锁类型 TM锁和TX锁 oracle 9i 10g 编程艺术书中对oracle 的锁类型有三种分类:DML锁,DDL 锁 以及 内部锁和闩 针对DML 锁并没有详细的介绍,只说明有TM(表)锁 和TX(行)锁 网上搜索了很多资料,在资料中有具体的分类 问题是:表头说这些锁都是TM锁... 但是我怎么感觉2,3 都属于TX锁呢?2,3 到底是TM 锁还是 TX 锁呢? 解决方案 TX锁和TM锁不是互斥的,DML 锁 先由TM锁获取表级锁,然后TX 在对具体行修改. 这

理解oracle锁和闩(2)锁机制概述

锁(lock)是一种防止多个事务访问同一资源时产生破坏性的相互影响的机制.通常,高并发数据库需要利用锁机制解决数据并发访问.一致性及完整性问题. 前面提到的资源(resource)大致可以分为两类: ● 用户对象:例如表及数据行 ● 对用户透明的系统对象:例如内存中的共享数据结构.数据字典中的信息 任何 SQL 语句执行时 Oracle 都隐式地对 SQL 所需的锁进行管理,因此用户无需显式地对资源加锁.Oracle 默认采用的锁机制能尽可能地减小对数据访问的限制,在保证数据一致性的同时实现高度

理解oracle锁和闩(1)与锁相关的数据结构

在oracle眼里,锁不是稀有资源,相反地,只要需要,你就应该长期地持有对数据所加的锁.行级锁根本没有相关开销,对1千万行锁定所需的资源数与对1行锁定所需的资源数完全相同,这是个常量. 在SGA中和锁相关的内存有两块:队列资源池和锁池.池:指的就是一块固定大小的内存. 队列资源池:存放所有的队列资源.锁就是队列资源. 例如:一个表上的TM锁就是一个队列资源,有多少个表就有多少个TM队列资源,如果有一个表的TM锁被持有,他就会被放进队列资源池.为了对他们加以区分,要为各个表的TM队列资源起个名字,

oracle中的闩锁(latch)简介

1.闩锁.锁定和并发性 数据库系统本身是一个多用户并发处理系统,在同一个时间点上,可能会有多个用户同时操作数据库.这里就涉及两个很重要的问题. 这些用户之间的操作不会互相破坏.比如两个用户同时在相同的物理位置上写数据时,不能发生互相覆盖的情况.这叫串行化,也就是说,即便两个用户同 时写,也必须有先后,一个用户写完,另一个用户继续写.串行化会降低系统的并发性,但这对于保护数据结构不被破坏来说则是必需的. 在满足串行化的前提下,如何将并发性提升到最大. 在Oracle数据库中,通过闩锁(latch)

Oracle 表级锁(TM锁)

假设某个用户(假设为A)发出如下的语句更新一条记录: SQL> update employees set last_name='HanSijie' where employee_id=100; 上面的例子,这时A用户已经发出了更新employee_id为100的记录的SQL语句.当A还没有提交之前 ,另外一个用户D发出下面的语句: SQL> drop table employees; 由于用户A还没有提交所做的事务,因此该事务还没有结束,其他用户还不能删除该表,否则A所发 出的事务就无法正常结

大话Linux内核中锁机制之内存屏障、读写自旋锁及顺序锁

大话Linux内核中锁机制之内存屏障.读写自旋锁及顺序锁     在上一篇博文中笔者讨论了关于原子操作和自旋锁的相关内容,本篇博文将继续锁机制的讨论,包括内存屏障.读写自旋锁以及顺序锁的相关内容.下面首先讨论内存屏障的相关内容. 三.内存屏障 不知读者是是否记得在笔者讨论自旋锁的禁止或使能的时候,提到过一个内存屏障函数.OK,接下来,笔者将讨论内存屏障的具体细节内容.我们首先来看下它的概念,Memory Barrier是指编译器和处理器对代码进行优化(对读写指令进行重新排序)后,导致对内存的写入

深入并行:从数据倾斜到布隆过滤深度理解Oracle的并行

陈焕生 Oracle Real-World Performance Group 成员,senior performance engineer,专注于 OLTP.OLAP 系统 在 Exadata 平台和 In-Memory 特性上的最佳实践.个人博客 http://dbsid.com . 编辑手记:感谢陈焕生授权我们发布他的精品文章,Sidney撰写这个系列的文章时间跨度也有两年,下篇刚刚出炉,我们先从他去年投稿的第一篇开始. 上一篇请阅读:深入并行:从生产者到消费者模型深度理解Oracle的并

深入并行:从并行加载到12c Adaptive特性深度理解Oracle并行

陈焕生 Oracle Real-World Performance Group 成员,senior performance engineer,专注于 OLTP.OLAP 系统 在 Exadata 平台和 In-Memory 特性上的最佳实践.个人博客 http://dbsid.com . 编辑手记:感谢陈焕生的精品文章,这篇文章首发在ACOUG,在此转载分享给大家,Sidney撰写这个系列的文章时间跨度也有两年,下篇刚刚出炉. 上篇分为两篇文章: 深入并行:从生产者到消费者模型深度理解Oracl

深入并行:从生产者到消费者模型深度理解Oracle的并行

陈焕生 Oracle Real-World Performance Group 成员,senior performance engineer,专注于 OLTP.OLAP 系统 在 Exadata 平台和 In-Memory 特性上的最佳实践.个人博客 http://dbsid.com . 编辑手记:感谢陈焕生授权我们发布他的精品文章,Sidney撰写这个系列的文章时间跨度也有两年,下篇刚刚出炉,我们先从他去年投稿的第一篇开始. Oracle 的并行执行 Oracle 的并行执行是一种分而治之的方