锁这玩意其实就是资源不够用的,需要排队来获取资源,就像过去大杂院里只有一个公共厕所,一大早很多少排队一样,等。操作系统有锁,数据库也有锁,这里锁的道理是一样的。

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

加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。

在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。

根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护数据库的内部结构。

接下来主要讲dml锁

DML锁分类表表1 Oracle的TM锁类型

锁模式锁描述解释SQL操作

0none

1NULL空Select

2SS(Row-S)行级共享锁,其他对象只能查询这些数据行Select for update、Lock for update、Lock row share

3SX(Row-X)行级排它锁,在提交前不允许做DML操作Insert、Update、Delete、Lock row share

4S(Share)共享锁Create index、Lock share

5SSX(S/Row-X)共享行级排它锁Lock share row exclusive

6X(Exclusive)排它锁Alter table、Drop able、Drop index、Truncate table 、Lock exclusive

这里用户拥有模式高的锁可以操作其它拥有模式低锁的对象。

1.关于 V$lock表和相关视图的说明

ColumnDatatypeDescriptionADDRRAW(4 | 8)Address of lock state object

KADDRRAW(4 | 8)Address of lock

SIDNUMBERIdentifier for session holding or acquiring the lock

TYPEVARCHAR2(2)Type of user or system lock

The locks on the user types are obtained by user applications. Any process that is blocking others is likely to be holding one of these locks. The user type locks are:

TM - DML enqueue

TX - Transaction enqueue

UL - User supplied

--我们主要关注TX 和TM 两种类型的锁

--UL锁用户自己定义的,一般很少会定义,基本不用关注

--其它均为系统锁,会很快自动释放,不用关注

ID1NUMBERLock identifier #1 (depends on type)

ID2NUMBERLock identifier #2 (depends on type)

---当lock type 为TM 时,id1 为DML-locked object 的object_id

---当lock type 为TX 时,id1 为usn+slot ,而id2 为seq 。

--当lock type 为其它时,不用关注

LMODENUMBERLock mode in which the session holds the lock:0 - none

1 - null (NULL)

2 - row-S (SS)

3 - row-X (SX)

4 - share (S)

5 - S/Row-X (SSX)

6 - exclusive (X)

--大于0时表示当前会话以某种模式占有该锁,等于0时表示当前会话正在等待该锁资源,即表示该会话被阻塞。

--往往在发生TX 锁时,伴随着TM 锁,比如一个sid=9 会话拥有一个TM 锁,一般会拥有一个或几个TX 锁,但他们的id1 和id2 是不同的,请注意

REQUESTNUMBERLock mode in which the process requests the lock:0 - none

1 - null (NULL)

2 - row-S (SS)

3 - row-X (SX)

4 - share (S)

5 - S/Row-X (SSX)

6 - exclusive (X)

--大于0时,表示当前会话被阻塞,其它会话占有改锁的模式

CTIMENUMBERTime since current mode was granted

BLOCKNUMBERThe lock is blocking another lock

0, 'Not Blocking', /* Not blocking any other processes */

1, 'Blocking', /* This lock blocks other processes */

2, 'Global', /* This lock is global, so we can't tell */

--该锁是否阻塞了另外一个锁

这里补充一下:

可用block查死锁,用lmode查对象和用户是否持有锁或者是否被锁。

其它相关视图说明视图名描述主要字段说明

v$session查询会话的信息和锁的信息。sid,serial#:表示会话信息。

program:表示会话的应用程序信息。

row_wait_obj#:表示等待的对象,和dba_objects中的object_id相对应。lockwait :该会话等待的锁的地址,与v$lock的kaddr对应.

v$session_wait查询等待的会话信息。sid:表示持有锁的会话信息。

Seconds_in_wait:表示等待持续的时间信息

Event:表示会话等待的事件,锁等于enqueue

dba_locks对v$lock的格式化视图。Session_id:和v$lock中的Sid对应。

Lock_type:和v$lock中的type对应。

Lock_ID1: 和v$lock中的ID1对应。

Mode_held,mode_requested:和v$lock中

的lmode,request相对应。

v$locked_object只包含DML的锁信息,包括回滚段和会话信息。Xidusn,xidslot,xidsqn:表示回滚段信息。和

v$transaction相关联。

Object_id:表示被锁对象标识。

Session_id:表示持有锁的会话信息。

Locked_mode:表示会话等待的锁模式的信

息,和v$lock中的lmode一致。

这里是关于锁的视图,关于锁基本信息都可查到。

死锁:

定义:当两个用户希望持有对方的资源时就会发生死锁.

即两个用户互相等待对方释放资源时,oracle认定为产生了死锁,在这种情况下,将以牺牲一个用户作为代价,另一个用户继续执行,牺牲的用户的事务将回滚.

例子:

1:用户1对A表进行Update,没有提交。

2:用户2对B表进行Update,没有提交。

此时双反不存在资源共享的问题。

3:如果用户2此时对A表作update,则会发生阻塞,需要等到用户一的事物结束。

4:如果此时用户1又对B表作update,则产生死锁。此时Oracle会选择其中一个用户进行会滚,使另一个用户继续执行操作。

起因:

Oracle的死锁问题实际上很少见,如果发生,基本上都是不正确的程序设计造成的,经过调整后,基本上都会避免死锁的发生。

最后谈谈锁来自何方:

在Oracle 数据库中,它并不是对某个表加上锁或者某几行加上锁,锁是以数据块的一个属性存在的。也就是说,每个数据块本身就存储着自己数据块中数据的信息,这个地方叫ITL(Interested Transaction List),凡是在这个数据块上Tianlesoftware

有活动的事务,它的信息就会记录在这里面供后续的操作查询,一保证事务的一致性。

oracle锁模式详解,oracle 锁讲解之一相关推荐

  1. mysql 事务 for update,mysql事务锁_详解mysql 锁表 for update

    摘要 腾兴网为您分享:详解mysql 锁表 for update,智慧农业,真还赚,悦读小说,学习帮等软件知识,以及电池管家,三国群英传3,userland,运满满货主版,王者荣耀,简单3d动画,嘉丽 ...

  2. 建oracle簇表,详解ORACLE簇表、堆表、IOT表、分区表

    详解ORACLE簇表.堆表.IOT表.分区表 簇和簇表 簇其实就是一组表,是一组共享相同数据块的多个表组成.将经常一起使用的表组合在一起成簇可以提高处理效率. 在一个簇中的表就叫做簇表.建立顺序是:簇 ...

  3. MySQL锁机制详解-表锁与行锁

    文章目录 1. 数据库锁理论 2. 锁的分类 2.1 按数据操作的类型分类 2.2 按数据操作的颗粒度分类 3. 表锁的应用 3.1 表锁相关命令 3.2 给表加表共享读锁 3.3 给表加表独占写锁 ...

  4. oracle重做日志详解,Oracle的重做日志

    Archive Redo log files--归档重做日志,简称归档日志,指当条件满足时,Oracle将在线重做日志以文件形式保存到硬盘(持久化). 重做日志的简单原理:在数据更新操作commit前 ...

  5. oracle list 分区详解,ORACLE分区表详解

    此文从以下几个方面来整理关于分区表的概念及操作:1.表空间及分区表的概念 2.表分区的具体作用 3.表分区的优缺点 4.表分区的几种类型及操作方法 5.对表分区的维护性操作. (1.) 表空间及分区表 ...

  6. oracle list 分区详解,Oracle分区表详解:

    Oracle分区表详解: 范围分区 范围分区根据您为每个分区建立的分区键值的范围将数据映射到分区.它是最常见的分区类型,通常与日期一起使用.例如,您可能希望将销售数据分区为每月分区. 使用范围分区时, ...

  7. oracle 数据库truncate,详解Oracle DELETE和TRUNCATE 的区别

    语法delete from aa truncate table aa 区别1.delete from后面可以写条件,truncate不可以. 2.delete from记录是一条条删的,所删除的每行记 ...

  8. oracle同义词truncate,详解Oracle DELETE和TRUNCATE 的区别

    语法 delete from aa truncate table aa 区别 1.delete from后面可以写条件,truncate不可以. 2.delete from记录是一条条删的,所删除的每 ...

  9. oracle数据库改名步骤,oracle 11g2 数据库改名详细解释 oracle数据库改名详解 oracle database 改名详解 dbname...

    前面讲过修改sid名字,虽然已经修改过了实例名(sid),但是数据库的名称(dbname还是原来的名称orcl) 下面详细描述,更改数据库名字的.详细过程如下: 1.更改存档日志,默认安装完的orac ...

最新文章

  1. shell中基本正则表达式的元字符
  2. 我来发美食啦,馋一下各位看官
  3. WAF果真是个好东西
  4. 【步态识别】基于CNN、步态能量图+HOG特征提取的步态识别算法的MATLAB仿真
  5. 神策数据关海南:营销策略引擎解读,以平台化构建营销新生态
  6. STD中string的常用方法总结
  7. Webpack初学者介绍
  8. oracle深度巡检指标,oracle DBA 巡检项目
  9. [原]用三行代码实现对音量的控制,实现增大,减小,静音
  10. pycharm 调试_把xlwings盘顺溜:xlwings连接到Pycharm进行调试,以及xlwings转换器等的使用...
  11. 机器学习算法总结之XGBoost(下) 实战与调参
  12. [CareerCup] 12.6 Test an ATM 测试一个自动取款机
  13. python 期货现货差价监测_Python期货期权无风险套利监控升级版
  14. python中if语句的实例_python的if语句里怎样写两个条件
  15. 微信小程序canvas绘制矩形
  16. 【mysql】--explain命令解析
  17. 正则表达式的基本用法
  18. 解决anaconda拆卸后,打开powershell提示 : 无法将“C:\ProgramData\Anaconda3\Scripts\conda.exe”项识别为 cmdlet、函数、脚本
  19. IN和EXISTS、not in 和not exists的效率详解
  20. jsp+servlet实现简单登录页面功能Demo

热门文章

  1. lnmp运行php原理,lnmp安装管理运行
  2. 中兴通讯BN MKT CTO易宇:开放激发潜能,融合创造未来
  3. win8修改窗口背景颜色的方法
  4. html中如何让方框有倾斜度,如何在CSS中创建带有边框的倾斜标签?
  5. 服务器共享文件加密软件哪个好,共享文件夹加密软件哪个好?共享文件加密软件推荐...
  6. 解决Office 2007和Visual Studio 2008冲突不兼容的问题
  7. Power-One电源维修Bel power电源维修PFC500-1024
  8. PKCS1 PKCS8 公私钥 加密解密过程
  9. 魅族6.0系统设备(亲测有效)激活Xposed框架的经验
  10. SSR 应用与原 CSR 应用变更同步问题实践