万字长文深入探究Oracle DML锁机制

本文深入探讨Oracle数据库的DML锁机制,包括锁的基本概念、Oracle的行级锁和表级锁、显式与隐式锁定、意向锁、锁转换与升级,以及通过实验分析了各种锁在实际操作中的应用和可能导致的锁阻塞情况。
摘要由CSDN通过智能技术生成

点击上方"蓝字"

关注我们,享更多干货!

1.1. 锁的基本概念

  • 锁的定义:锁(lock)机制用于管理对共享资源的并发访问,用于多用户的环境下,可以保证数据库的完整性和一致性。锁是防止访问相同资源的事务之间的破坏性,交互的机制。既可以是用户对象(例如表或行),也可以是对用户不可见的系统对象(例如共享数据结构和数据字典行)。

  • 锁的作用:在并发事务之间防止破坏性的交互作用,不需要用户的动作,自动使用最低的限制级别,在事务处理期间保持。

  • 为了确保并发用户在存取同一数据库对象时的正确性(即无丢失修改、可重复读、不读“脏”数据),数据库中引入了锁机制。基本的锁类型有两种:排它锁(Exclusive locks记为X锁)和共享锁(Share locks记为S锁)。

  1. 排它锁:若事务T对数据D加X锁,则其它任何事务都不能再对D加任何类型的锁,直至T释放D上的X锁;一般要求在修改数据前要向该数据加排它锁,所以排它锁又称为写锁。

  2. 共享锁:若事务T对数据D加S锁,则其它事务只能对D加S锁,而不能加X锁,直至T释放D上的S锁;一般要求在读取数据前要向该数据加共享锁,所以共享锁又称为读锁。

引用:

共享锁(S):
小明和小胖是好朋友,有一天他们俩得到了一份纸质版且纸比较破武功秘籍,为了让这份武功秘籍不再丢失什么内容,于是就用一个玻璃盒子存储起来。


这时候小胖提议在盒子上加了一把锁,保护好里面的内容不被破坏。

加上锁之后,大家都能看,但是不能修改,难度增大了!大家都看到你们加锁了,并且这东西是免费的,所以我也要加锁,于是这秘籍的外表框上加上了很多的锁,这些锁统称为共享锁(S)。


我们通过图可以直到,共享属锁加上之后,我们只能看到秘籍(内容),但是想撕去一点点秘籍或修改上面的内容都不行,所以大家都只能看,不能修改,这就是共享锁为什么又称为读锁的原因。

如果要修改上面的内容或者换一本秘籍在玻璃里面展示的话,这个时候需要将所有的锁都去除掉,才能操作,否则就只能看。

排它锁(X)
同样,有一本武功秘籍,这次被小胖捡到了,于是:


这个时候小明来了,看到这个箱子被小胖加上了排它锁(X),别人看不到也修改不了里面的内容,同时别人想加上其他锁也不能。



最后,小胖给了小明一个排它锁的钥匙,这个时候小明也能看箱子里面的内容,同时也可以修改箱子里面的内容。

1.2. Oracle 锁机制介绍

根据保护对象的不同,单实例Oracle数据库锁可以分为以下几大类:

  • DML lock(data locks,数据锁):用于保护数据的完整性;

  •  DDL lock(dictionary locks,字典锁):用于保护数据库对象的结构(例如表、视图、索引的结构定义);

  •  internal locks,latches,mutex,pin:保护内部数据库结构;

本文主要讨论DML(也可称为data locks,数据锁)锁。从封锁粒度(封锁对象的大小)的角度看,Oracle DML锁共有两个层次,即行级锁和表级锁。

1.3. 显式锁定和隐式锁定

有两种类型:显式锁定和隐式锁定。

  • 隐式锁:Oracle锁被自动执行,并且不要求用户干预的锁。对于SQL语句隐式锁是必须的,依赖被请求的动作。隐式锁定除SELECT外,对所有的SQL语句都发生。

  • 显式锁:用户也可以手动锁定数据。

  • 隐式锁定:这是Oracle中使用最多的锁。通常用户不必声明要对谁加锁,Oracle 自动可以为操作的对象加锁,这就是隐式锁定。

  • 显式锁定:用户可以使用命令明确的要求对某一对象加锁。显式锁定很少使用。

1.3.1. 显式锁定

只有TM表锁。

LOCK TABLE TABLE_NAME IN ROW SHARE MODE NOWAIT; --2:RS
LOCK TABLE TABLE_NAME IN SHARE UPDATE MODE; --2:RS
LOCK TABLE TABLE_NAME IN ROW EXCLUSIVE MODE NOWAIT; --3:RX
LOCK TABLE TABLE_NAME IN SHARE MODE; --4:S
LOCK TABLE TABLE_NAME IN SHARE ROW EXCLUSIVE MODE; --5:SRX
LOCK TABLE TABLE_NAME IN EXCLUSIVE MO

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值