数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。锁机制用于管理对共享资源的并发访问。

根据保护的对象不同,Oracle数据库锁可以分为以下几大类:
DML锁(data locks,数据锁),用于保护数据的完整性;主要包括TM锁和TX锁,其中TM锁称为表级锁(DML Enqueue 锁:用于确保在修改表的内容时,表的结构不会改变),TX锁称为事务锁或行级锁(事物发起第一个修改时会得到TX锁,而且会一直持有这个锁,直至事务执行提交或回滚)。
DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;主要包括排它DDL锁、共享DDL锁、可中断解析锁
内部锁和闩(internal locks and latches),保护数据库的内部结构,应用于SGA;

行级锁基本原理:

行级锁的信息是置于数据块中的,如果要修改某一条记录的值,其实就是在访问相应的block,并且分配一个ITL,然后通过rowid访问rowpiece header ,如果第二个字节lock byte(lock byte只占用1个字节,最大值为255,这也是为什么maxtrans最大为255)为0,则将其改为分配的ITL slot number。另外一个事务如果也想要修改数据,就会发现lock byte不为0,如果第一个事务还没有结束,则第二个事务进入enqueue等待,也就是transaction enqueue。

v$lock.LMODE字段中的数字对应的锁类型

LMODE(Lockmode in which the session holds the lock):

0 -none

1 -null (NULL)

2 -row-S (SS)               ----Row Share (RS|SS)

3 -row-X (SX)        ----Row Exclusive Table Lock (RX|SX)

4 -share (S)          ----Share Table Lock (S)

5 -S/Row-X (SSX)     -----Share Row Exclusive Table Lock (SRX|SSX)

6 -exclusive (X)         ------Exclusive Table Lock (X)

值 锁模式 锁描述 SQL
0 NONE    
1 NULL 空 SELECT
2 SS(ROW-S) 行级共享锁 其他对象只能查询这些数据行 SELECT FOR UPDATE、LOCK FOR UPDATE、 LOCK ROW SHARE
3 SX(ROW-X) 行级排它锁 在提交前不允许做DML操作 INSERT、UPDATE、DELETE、 LOCK ROW SHARE
4 S(SHARE) 共享锁 CREATE INDEX、LOCK SHARE
5 SSX(S/ROW-X) 共享行级排它锁 LOCK SHARE ROW EXCLUSIVE
6 X(eXclusive) 排它锁 ALTER TABLE、DROP TABLE、DROP INDEX、 TRUNCATE TABLE、LOCK EXCLUSIVE

各种TM锁类型的兼容情况如下:

 

RS|SS

RX|SX

S

SRX|SSX

X

RS|SS

√

√

√

√

×

RX|SX

√

√

×

×

×

S

√

×

√

×

×

SRX|SSX

√

×

×

×

×

X

×

×

×

×

×

以下是一些针对ORACLE锁的直观阐述:

只有被修改时,行才会被锁定。

当一条语句修改了一条记录,只有这条记录上被锁定,在Oracle数据库中不存在锁升级。

当某行被修改时,它将阻塞别人对它的修改。

当一个事务修改一行时,将在这个行上加上行锁(TX),用于阻止其它事务对相同行的修改。

读永远不会阻止写。

读不会阻塞写,但有唯一的一个例外,就是select ...for update。

写永远不会阻塞读。

当一行被修改后,Oracle通过回滚段提供给数据的一致性读

[整理]Oracle LOCK 机制的更多相关文章

  1. Oracle 锁机制探究

    以前虽然在网上看到很多关于Oracle锁机制的描述,但总感觉哪里有缺陷不适合自己,因此花了点时间参考官网以及Tom Tyke的<Oracle 9i/10g/11g编程艺术>一书整理了一下O ...

  2. [Oracle] Lock&Latch梳理

    Oracle lock&latch 1. 概述 4种锁机制 lock latch pin mutex 保证资源在并发访问和修改时不被破坏 锁类型 行为 持有时间 级别 保护类型 lock 队列 ...

  3. 转载:Java Lock机制解读

    Java Lock机制解读 欢迎转载: https://blog.csdn.net/chengyuqiang/article/details/79181229 1.synchronized synch ...

  4. C# Note26: [MethodImpl(MethodImplOptions.Synchronized)]与lock机制

    在进行.NET开发时,经常会遇见如何保持线程同步的情况.在众多的线程同步的可选方式中,加锁无疑是最为常用的.如果仅仅是基于方法级别的线程同步,使用System.Runtime.CompilerServ ...

  5. 整理oracle 树形查询

    注:本文参考了<整理oracle 树形查询> sql树形递归查询是数据库查询的一种特殊情形,也是组织结构.行政区划查询的一种最常用的的情形之一.下面对该种查询进行一些总结: create ...

  6. 利用LOCK机制来定位前缀劫持者

    一.文章信息 作者:Tongqing Qiu, Lusheng Ji, Dan Pei等 单位:佐治亚理工学院.美国电话电报公司实验室.康奈尔大学等 来源:Conference on Usenix S ...

  7. Oracle 锁机制

    本文参考自:ORACLE锁机制 1.oracle是一个多用户使用的共享资源,当多个用户并发的操作同一数据行时,那么在oracle数据库中就会存在多个事务操作统一数据行的操作,如果不对并发操作进行控制, ...

  8. mongodb给我们提供了fsync+lock机制把数据暴力的刷到硬盘上

    能不能把数据暴力的刷到硬盘上,当然是可以的,mongodb给我们提供了fsync+lock机制就能满足我们提的需求. fsync+lock首先会把缓冲区数据暴力刷入硬盘,然后给数据库一个写入锁,其他实 ...

  9. JUC包Lock机制的支持--AQS

    在上一次总结中,提到了JUC包下使用Lock接口实现同步的方法,以及和Synchronized关键字的一些比较,那么使用Lock完成锁机制的底层支持又是什么呢?总结如下: 1 AQS是什么 AQS是一 ...

随机推荐

  1. BZOJ_1606_ [Usaco2008_Dec]_Hay_For_Sale _购买干草_(背包)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1606 价值和重量相等的01背包问题. 分析 ... #include <bits/std ...

  2. Linux kernel 内存泄露本地信息泄露漏洞

    漏洞名称: Linux kernel 内存泄露本地信息泄露漏洞 CNNVD编号: CNNVD-201311-467 发布时间: 2013-12-06 更新时间: 2013-12-06 危害等级:    ...

  3. BZOJ2553: [BeiJing2011]禁忌

    2553: [BeiJing2011]禁忌 Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 203  Solved: ...

  4. 由点击页面其它地方隐藏div所想到的jQuery的delegate

    对于这个问题一般有两种思路,这两种思路都会利用事件冒泡这一原理,想要详细了解Javascript事件机制可以看看JavaScript与HTML交互——事件,这不是本文重点,所以这里只是简单介绍一下事件 ...

  5. 【CSS】Intermediate2:Pseudo Classes

    1.specify a state or relation to the selector selector:pseudo_class { property: value; } 2.Link 3.Dy ...

  6. Tutorial: Getting Started with SignalR (C#) -摘自网络

    Overview This tutorial introduces SignalR development by showing how to build a simple browser-based ...

  7. puppet重申证书

    直接上步骤,由于测试用的是PE3.X版本,在网上搜的命令几乎与PE相关的puppet命令不同了, 1.在PE-Client操作,停止pe-puppet,pe-mcollective资源; puppet ...

  8. IPAddress类

    using System.Net; IPAddress ad1=IPAddress.Parse("192.168.1.1"); //ip为192.168.1.1的地址 IPAddr ...

  9. shiro权限控制方式

    1.基于配置文件(*.ini)[常用jdbcRealm.ini] 2.基于注解的配置 3.基于jsp标签的配置(需要导入对应的标签jar包) 权限包含: 是否为特定用户 是否为特定角色 是否拥有特定操 ...

  10. 用lambda构建ORM查询语句

    本文介绍如何解析lambda表达式来获取一个满足条件的查询语句. 先看个截图  通过设置实体对象Article_Content的查询表达式,就可以获取对应的参数化SQL语句,使用起来很方便,减少了代码 ...