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限制程度最低,因而能够保证表的最大的并发访问能力

允许的操作:某个事务拥有了某个表的行共享表级锁后,其他事务依然可以并发地对相同数据表执行查询,插入,更新,删除操作,或对表内数据行加锁的操作.

禁止的操作:LOCK TABLE table IN EXCLUSIVE MODE

RX

行排他表级锁(row exclusive table lock)(也被称为 subexclusive table lock, SX)通常表明拥有此锁的事务已经对表内的某些数据行进行了更新操作。当事务使用以下语句修改数据表时将自动地获得行排他表级锁:

INSERT INTO table ... ;

or

UPDATE table ... ;

or

DELETE FROM table ... ;

or

LOCK TABLE table IN ROW EXCLUSIVE MODE;

RX比RS限制程度略高。

允许的操作:某个事务拥有了某个表的行排他表级锁后,其他事务依然可以并发地对相同数据表执行查询,插入,更新,删除操作,或对表内数据行加锁的操作。

禁止的操作:

LOCK TABLE table IN SHARE MODE;

or

LOCK TABLE table IN SHARE EXCLUSIVE MODE;

or

LOCK TABLE table IN EXCLUSIVE MODE;

S

以下语句能够获得表上的共享表级锁(share table lock):

LOCK TABLE table IN SHARE MODE;

注意,在创建索引时,会缺省地加上S锁。7*24业务这条语句(等价于建索引)会使得所有DML都被阻塞!!

允许的操作:某个事务拥有了某个表的S锁后,其他事务可以查询表,可以使用 SELECT ... FOR UPDATE 语句锁定选中的数据行,也能够成功执行 LOCK TABLE ... IN SHARE MODE 语句。多个事务可以并发地获得同一个表上的S锁,在此种情况下任何事务都不能对表进行更新。拥有S锁的事务只有在此表上没有其他事务的S锁时,才能对表进行更新操作。

禁止的操作:

LOCK TABLE table IN ROW EXCLUSIVE MODE;

OR

LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;

OR

LOCK TABLE table IN EXCLUSIVE MODE;

SRX

共享行排他表级锁(share row exclusive table lock)(也称为 share-subexclusive table lock,SSX)与S锁相比限制更为严格。用户可以使用以下语句获得SRX:

LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;

允许的操作:同一时间只有一个事物能够获得表的共享行排他表级锁。某个事务拥有了某个表的共享行排他表级锁后,其他事务可以查询表,可以使用SELECT ... FOR UPDATE 语句锁定选中的数据行,但不能对表进行更新操作。

禁止的操作:

LOCK TABLE table IN ROW EXCLUSIVE MODE;

or

LOCK TABLE table IN SHARE MODE;

or

LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;

or

LOCK TABLE table IN EXCLUSIVE MODE;

X

排他表级锁(exclusive table lock)是限制程度最高的表级锁,她能使获得此锁的事务排他地对表进行写操作。排他表级锁可以使用以下语句获得:

LOCK TABLE table IN EXCLUSIVE MODE;

允许的操作:同一时间只有一个事务能获得表上的X锁。一个事务获得X后,其他事务只能对表进行查询操作。

禁止的操作:一个事务获得X锁后,将禁止其他事务对表执行任何 DML 操作,其他事务也无法获取表上任何类型的锁。

当TM锁获得后,系统会自动申请TX锁,并将实际locking的行级锁的锁标志位置位(指向该TX锁)。

oracle视频教程请关注: http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html

oracle 闩情况,理解oracle锁和oracle闩(3)TX锁和TM锁相关推荐

  1. 【锁】Oracle锁系列

    2019独角兽企业重金招聘Python工程师标准>>> [锁]Oracle锁系列 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可 ...

  2. ORACLE的TX锁和TM锁及解锁

    数据库是一个并发访问的系统,所以说对一个数据库来说最大的问题就是并发控制的问题,这个并发控制所表现的不是在并发读上面,而是在并发写上面.对应并发写,就需要保证数据的一致性!那么什么是是数据一致性呢? ...

  3. oracle什么是全局锁,深入浅出oracle锁---原理篇

    这几天项目中遇到了数据库锁的问题,还在解决中,找到了一篇原理性的文章,分享一下. 在现代的多用户多任务系统中,必然会出现多个用户同时访问共享的某个对象,这个对象可能是表,行,或者内存结构,为了解决多个 ...

  4. oracle dba_waiters中的lockid是什么,Oracle 锁机制学习

    锁的简介: Oracle实现并发访问控制,通过锁来实现. 锁分为悲观锁(事务调度可能会串行调度)--事务级别的行级锁. 乐观锁(事务被串行调度)-- 时间戳和基于验证的事务调度. 所谓乐观锁是指事务调 ...

  5. Oracle的概念理解

    1.了解一些关于数据库的概念 2.了解oracle背景 3.oracle数据库服务器的组成 4.oracle数据库服务器与orcl数据库的关系 5.如何在oracle数据库服务器中创建多个数据库 6. ...

  6. oracle中@,深入理解Oracle中的DBCA

    但凡是学习 过Oracle的同学,DBCA都是一个必备工具,有了这个工具,创建数据库成为可能.而DBCA本身有图形和静默两种方式.静默方式看起来高大上,可以轻松搞定一个看似很复杂的创建数据库过程,而只 ...

  7. oracle锁mode,【案例】Oracle dml操作产生TM锁 lmode=6 分析原因和解决办法

    [案例]Oracle dml操作产生TM锁 lmode=6 分析原因和解决办法 时间:2016-12-04 20:22   来源:Oracle研究中心   作者:网络   点击: 次 天萃荷净 Ora ...

  8. oracle非管理员锁表,oracle默认管理员的帐号和密码以及密码修改和解除锁定

    安装 ORACLE 时,若没有为下列用户重设密码,则其默认密码如下: 用户名 / 密码 登录身份 说明 sys/change_on_install SYSDBA 或 SYSOPER 不能以 NORMA ...

  9. oracle consistent gets,Oracle buffer cache理解之七——统计信息!

    前文说了buffer cache的管理和DBWR进程是如何写文件的,更加具体的细节这里就不阐述了,这篇文章我们来了解一下关于buffer cache的统计信息,这里只介绍比较重要的几个统计信息参数: ...

最新文章

  1. matlab四节点矩形单元的应变,四节点矩形单元有限元解读.ppt
  2. 科大星云诗社动态20210208
  3. laravel 重要概念 以及实现方式
  4. 程序员修仙之路--优雅快速的统计千万级别uv
  5. java mset_Java 反射机制(包括组成、结构、示例说明等内容)
  6. python3中round的用法_Python 3标准库用法--reversed、round、set
  7. 如何重置 RHEL7/CentOS7 系统的密码
  8. Aberrant DSP SketchCassette II Mac(磁带混音效果插件)
  9. 安卓系统源码、内核下载
  10. 六自由度机器人(机械臂)运动学建模及运动规划系列(一)——简介
  11. android 显示网速,随着掌握联网状态 Android手机如何显示实时网速
  12. 中通快递 | 轨迹查询接口
  13. Wampserver图标是橙色的【问题与解决方案】
  14. HTML代码格式化工具
  15. 【算法-1】输出网格图形
  16. kettle资源库备份
  17. 07年时写给刚入职的同事的一封信
  18. 前端入门篇(三十一)搜索框和购物车图标
  19. Java中Date数据类型的数值转换
  20. 查看git当前tag_Git tag常用命令分享

热门文章

  1. Python小实例摄氏度华氏度转换
  2. 开源应用中心 | Wordpress、Discuz! Q等应用免代码,极速开通
  3. 长波、中播、短波、微波知识扫盲
  4. 快速了解A/D(模数转换器)
  5. 根据三角形的三条边长,判断三角形
  6. jackson、fastjson、kryo、protostuff等序列化工具性能对比
  7. 台式计算机运行fdtd配置,FDTD操作案例
  8. 《Who moved my cheese?》笔记
  9. 一种更高效的费用流算法——zkw费用流
  10. baocms伪静态_最新Baocms+Niucms整合完整版源码生活o2o程序,商城,活动营销,微信,wap等...