这个问题很简单,你一定对锁有一个认识,但你未必对锁有一个明确的定义。

官方文档这样描述:Locks are mechanisms that prevent destructive interaction between transactions accessing the same resource—either user objects such as tables and rows or system objects not visible to users, such as shared data structures in memory and data dictionary rowsIn all cases, Oracle automatically obtains necessary locks when executing SQL statements, so users need not be concerned with such details. Oracle automatically uses the lowest applicable level of restrictiveness to provide the highest degree of data concurrency yet also provide fail-safe data integrity. Oracle also allows the user to lock data manually.好,我在用中文啰嗦一遍:锁是一种机制,它用于管理对共享资源的并发访问。注意,我说的是“并发资源”而不是“数据库行”。oracle会在行级对表数据锁定,这固然不错,不过ORACLE也会在其他多个级别上使用锁,从而对多种不同的资源提供并发访问。例如执行一个存储过程中,过程本身会以某种模式锁定,以允许其他用户执行这个过程,但是不允许另外的用户以任何方式修改这个过程。数据库中使用锁是为了支持对共享资源进行并发访问,与此同时还能提供数据的完整性和一致性。在你执行SQL语句时,锁会以最低级别的使用来保证最大程度上的并发支持与最大程度上的数据安全支持,你不需要太关心锁的问题。但是oracle也允许你来手动加锁。

二、锁的类型

Oracle大体上主要的有3种类型的锁,DML锁、DDL锁、闩和内部锁,这三种锁有它们各自的使用场景、使用目的以及各自的针对性。

1)DML锁1、row lock (TX锁)这是一个行级锁,主要用来防止两个事务对同一行的同时修改。TX锁用作为一种排队机制,使得其他会话来等待这个事务执行。行级别上只有这一种锁,当行上有这个锁时,就永远不会在有第二个这个锁。但是一个表上可以在多行上有多个这种锁。如果要在表上的某一行加这个tx锁,那么一定要在这个表上加一个表级锁。下来就来说说表级锁。

2、table lock(TM锁)这是一个表级锁,当有DML操作insert,update,delete,select……for update,lock table时,将在表上加上TM锁,DML操作需要加上表级锁有两个目的:1)为该事务保留对该表的DML操作权限 2)防止有ddl操作改变表的结构。TM锁可以排斥DDL锁(DDL锁中的一种共享ddl锁可以与TM锁共存,但大多数DDL操作并不会用这种锁),这样DDL操作就无法进行(下面会讲到DDL锁)。但不会影响DML操作。table lock可以有以下几种模式:

2)DDL锁

在DDL操作中会自动为对象加DDL锁,从而保护这些对象不会被其他会话锁修改。例如,如果我执行了一个DDL操作 alter table t,表T上就会加一个排他DDL锁,这个排他DDL锁会防止其他会话得到这个表上的DDL锁和TM锁。

有三种类型的DDL锁

1、排他DDL锁(Exclusive DDL lock):这会防止其他会话得到它们自己的DDL锁或TM(DML)锁。这也表明了,在加上这种类型的DDL锁后,DDL操作期间可以查询一个表,但是无法以任何方式修改这个表的结构和数据。

2、共享DDL锁(Share DDL lock):这些锁会保护锁引用对象的结构,使之不被其他会话修改,但是允许修改数据。3、可中断解析锁(Share DDL lock):这些锁允许一个对象(如共享池中缓存的一个查询计划)像另外某个对象注册依赖性。如果在被依赖的对象上执行DDL,ORACEL会查看已经对该对象注册了依赖性的对象列表,并使这些对象无效。因此,这些所是“可中断的”,它们不能防止DDL出现。举个例子:你的会话解析一条语句时,对于该语句引用的每一个对象都会加一个解析锁。加这些锁的目的是:如果以某种方式删除或修改了一个被引用的对象,可以将共享池中已解析的缓存语句置为无效(刷新输出)。

大多数DDL带有一个排他DDL锁。

3)闩和内部锁

先不讲啦!!!!!

三、手动锁定和用户锁定

1)手动锁定

1、通过一条SQL语句进行锁定,可使用的的SQL语句有select * from table for update/select * from table for update nowait/lock table  emp in exclusive mode这三种方法。

简单来说一下这三种的不同之处,select  * from table for update和select * from table for update nowait,可以通过使用where条件提供细粒度的锁定。nowait的涵义是“不用等待,立即返回”,当要请求的资源被其他资源占有  时,不会堵塞等待,而是立即返回,返回什么呢?返回一个如下的错误提示:

ERROR at line 1:

ORA-00054: resource busy and acquire with NOWAIT specified

lock table emp in XX mode这种方法对整张表进行加锁,实际中很少使用。

2)通过DBMS_LOCK创建自己的锁。

不讲啦!!

四、随机想到的一点补充

oracle不会在任何地方存储行级锁的列表,也就是说,不会为每一个被锁定的行维护一个表,那样开销就太大了。为什么会提出这个问题的。

下面我们来看这个更新:

我这里更新了4行数据,在这4行中都将有一个TX锁,如果我们来查询V$lock来查看,许多人都认为v$lock中会友4行,因为我们锁定了4行。但是不是这样的,如前所述,不存在行级锁的一个主列表。如果某个会话将EMP表中一行锁定,v$lock视图中就有对应这个会话的一行来指示这一个事实。如果一个会话锁定了EMP表中的数百万行,v$lock视图中对应这个会话还是只有一行。这个视图显示了各个会话有哪些队列锁。

对应上面更新的v$lock视图:

lock的深入探讨连接:

ballontt

2012.11.28

----The End----

oracle查看dml锁表,【lock】我所认识的Oracle中的锁,DML锁、DDL锁、闩和内部锁。...相关推荐

  1. oracle查看相关用户表

    oracle查看相关用户表 select TABLE_NAME from user_tables  //当前用户表 select TABLE_NAME from dba_tables  //所有用户表 ...

  2. oracle 查看锁死的表

    oracle 查看锁死的表,锁死的进程. select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_n ...

  3. oracle查看表空间的内容,学习笔记:Oracle查看object对象 表空间 表 索引 数据文件的使用空间...

    天萃荷净 运维DBA咨询想要查看Oracle的object对象的使用空间大小,包括表空间 表 索引 数据文件的使用空间 1.查看Oracle表空间大小 Select Tablespace_Name,S ...

  4. oracle锁表怎么解决,Oracle锁表问题的简捷处理技巧

    在开发Oracle数据库时,我们常遇到频繁操作的Oracle数据表,会出现Oracle锁表.现在就针对这一问题,提下个人的解决Oracle锁表的技巧. 首先问题分析: (1)锁的分析 ORACLE里锁 ...

  5. oracle查询表的id,oracle 查看所有用户及密码 实现Oracle查询用户所有表

    1.oracle 查看所有用户及密码 SQL> select username from dba_users; 2. 实现Oracle查询用户所有表 下面为您介绍的语句用于实现Oracle查询用 ...

  6. oracle创建索引占用表空间吗,oracle创建索引表空间

    或者 drop tablespace 表空间名称 including contents;(表空间下有数据时候用) temporary tablespace 是 oracle 里临时表空间,临时表空间主 ...

  7. oracle查看外键约束哪个字段,oracle 查看主外键约束(转)

    oracle 查看主外键约束(转) 上一篇 / 下一篇  2011-07-05 17:37:49 / 个人分类:数据库 select a.constraint_name, a.table_name, ...

  8. oracle安装显示注册表,windows下oracle 11g r2 安装过程与卸载详细图解

    Oracle 11g安装 1.解压下载的包,然后进入包内,点击setup.exe开始安装 . 2.出现如下:一般把那个小对勾取消,点击下一步进行, 弹出下图这个后点'是' 3.下图后,选择创建和配置数 ...

  9. oracle 查看服务器密码修改,如何修改oracle用户密码

    修改oracle用户密码的方法:首先连接oracle数据库所在服务器,并进入oracle控制台:然后输入"select username from dba_users"查看用户列表 ...

最新文章

  1. 终于,「最近邻搜索」有通用方法了
  2. 最长公共子序列的C++实现---附二维指针的使用方法
  3. Java中非法参数的异常_Java中的异常
  4. 如何清理镜子上的水渍:亲测有效
  5. java mplayer 源码_师兄写的一个JAVA播放器的源代码
  6. 洛谷 P4551 最长异或路径
  7. 数据可视化(BI报表的开发)第四天
  8. 演示数据块整理(合并)的效果
  9. GCC 常见参数配置
  10. Centos7 连接Serial串口记录
  11. HTML5网站大观:10个精美的 HTML5 企业网站欣赏
  12. linux第三版 网页链接
  13. 【verilog教程】第9篇:verilog常见问题合集
  14. 一个正经的前端学习 开源 仓库(阶段二十六)
  15. 青龙面板2.8 Ninja扫码安装教程(二)
  16. Modem2G/3G/4G/5G:吐血总结:30分钟掌握高通modem RFFE driver(射频驱动)配置方法(一)
  17. php5 安装imagick,为php安装imagick拓展与image magick图像处理库
  18. 阿里云平台购买域名 备案步骤
  19. 学习Android路上的一些感慨和总结,慢慢来,比较快!
  20. pthread_cond_broadcast pthread_cond_signal

热门文章

  1. springcloud学习——zookeerper
  2. 80老翁谈人生(11):高考查分的往事
  3. 机器学习A-Z~支持向量机
  4. 2021-07-08操作系统知识:程序计数器(pc)、指令寄存器(IR)、通用寄存器(GR)、状态寄存器(SR)、程序状态字PSW
  5. STM32——GPIO
  6. 矩阵乘法 递归 优化 c语言,矩阵乘法优化递归式
  7. 0x00000050解决方法
  8. WindowsCE.Net下CAN卡的驱动程序设计
  9. 日语口语1.10 実はわが社は貴社の取り扱い製品に興味を持っておりますので
  10. windows8下载