Oracle DBA面试笔试之锁系列

0    519    1

Tags:

👉 本文共约10320个字,系统预计阅读时间或需39分钟。

在Oracle中,锁分为哪几类?

在Oracle中,锁分为哪几类?

在Oracle中,显式锁和隐式锁的区别有哪些?

在Oracle中,显式锁和隐式锁的区别有哪些?

在Oracle中,与锁有关的数据字典视图有哪些?

在Oracle中,与锁有关的数据字典视图有哪些?

在Oracle中,DML_LOCKS和DDL_LOCK_TIMEOUT参数的作用有哪些?

在Oracle中,DML_LOCKS和DDL_LOCK_TIMEOUT参数的作用有哪些?

在Oracle中,SELECT ... FOR UPDATE加的是什么锁?

在Oracle中,SELECT ... FOR UPDATE加的是什么锁?

在Oracle中,在编译存储过程、函数等对象时无响应该怎么办?

在Oracle中,在编译存储过程、函数等对象时无响应该怎么办?

在Oracle中,对于错误“ORA-08104”应该如何处理?(如何清除创建失败的索引?)

在Oracle中,对于错误“ORA-08104”应该如何处理?(如何清除创建失败的索引?)

在Oracle中,死锁的产生情况有哪些?

在Oracle中,死锁的产生情况有哪些?

在Oracle中,模拟死锁产生的一个场景。

在Oracle中,模拟死锁产生的一个场景。

在Oracle中,Lock、Latch和Pin的区别有哪些?

在Oracle中,Lock、Latch和Pin的区别有哪些?

在Oracle中,在高并发、高负载的情况下,如何给表添加字段并设置DEFAULT值?

在Oracle中,在高并发、高负载的情况下,如何给表添加字段并设置DEFAULT值?

Oracle新建或重建索引过程中的锁有哪些变化

在Oracle中,在新建或重建索引时有哪些锁?

可以利用10704和10046事件跟踪新建或重建索引过程中的锁信息,命令为:

新建或重建索引的锁信息如下图所示:

不带ONLINE的新建或重建索引的SQL语句获取的是4级TM锁,它会阻塞任何DML操作。

在Oracle 10g中,带ONLINE的新建或重建索引的SQL语句在开始和结束的时候获取的是4级TM锁,而在读取表数据的过程中获取的是2级TM锁,所以,在Oracle 10g中,即使加上ONLINE也会阻塞其它会话的DML操作。

在Oracle 11g中,带ONLINE的新建或重建索引的SQL语句在整个执行过程中获取的是2级TM锁,并不会阻塞其它会话的DML操作,但是在创建或重建索引的过程中,其它的会话产生的事务会阻塞索引的创建或重建操作,所以必须结束其它会话的事务才能让创建或重建索引的操作完成。所以应该避免在业务高峰期创建索引。

在Oracle 11g带ONLINE的新建或重建索引的情况下:

① 过程中会持有OD(ONLINE DDL)、DL(Direct Loader Index Creation)两种类型的锁,在Oracle 10g下只有DL锁没有OD锁。

② 表级锁TM的持有模式为2级RS(Row Share)与3级RX(Row Exclusive)类型的锁互相兼容,因此不会在表级发生阻塞。

③ 阻塞发生在行级锁申请阶段,即请求的4级S(Share)类型的锁与执行DML的会话已经持有的6级X(Exclusive)锁之间存在不兼容的情况;相比非ONLINE方式的表级锁,锁的粒度上更加细化,副作用更小。

④ 新增以“SYSJOURNAL”为前缀的IOT表,记录与索引创建动作同时进行的其它DML操作修改过的记录,等到索引创建完成前将IOT表里的记录合并至索引中并删除IOT表。

详情请参考:https://www.dbaup.com/oraclexinjianhuozhongjiansuoyinguochengzhongdesuoxinxi.html

其它

请问Oracle数据库锁的作用是什么?

多用户系统并发访问并修改数据时,保护数据的一致性和完整性。

锁是一种机制,多个事务同时访问一个数据库对象时,该机制可以实现对并发的控制。

Oracle正是使用锁机制来实现系统的高并发,利用不同类型的排它锁或者共享锁来管理并发会话对数据的操作。数据库是一个多用户使用的共享资源。当多个用户并发地存取修改同一数据时,若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性和完整性。Oracle数据库通过其锁机制在事务之间提供数据并发性、一致性和完整性。锁定是自动发生的,通常不需要用户操作。

请问Oracle锁存储在哪里?

在oracle数据库中,不存在真正意义上属于某个对象或数据的锁。oracle锁的信息是数据块的一个物理属性,而不是逻辑上属于某个表或某个行。Oracle的锁机制是一种轻量级的锁定机制,不是通过构建锁列表来进行数据的锁定管理,而是直接将锁作为数据块的属性,存储在数据块首部。在 Oracle 数据库中,它并不是对某个表加上锁或者某几行加上锁, 锁是以数据块的一个属性存在的。也就是说, 每个数据块本身就存储着自己数据块中数据的信息,这个地方叫 ITL( Interested Transaction List), 凡是在这个数据块上有活动的事务,它的信息就会记录在这里面供后续的操作查询,一保证事务的一致性。

请问Oracle锁有哪些类别?分别介绍下?

img

一:根据获取锁的方式,锁分为以下两种

排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。

1.1 排它锁:事务设置排它锁后,该事务单独获得此资源,另一事务不能在此事务提交之前获得相同对象的共享锁或排它锁。

可以理解为写锁,这种锁是防止资源的共享,用于修改数据。如果一个事物给某个数据加了排它锁,其它事物就不能对它再加任何锁,直到事物完结,排它锁释放。

1.2 共享锁:共享锁使一个事务对特定数据库资源进行共享访问,另一事务也可对此资源进行访问或获得相同共享锁。共享锁为事务提供高并发性,容易造成死锁和数据更新丢失。

可以理解为读锁,加了共享锁的数据,只能共享读,不能再给它加排它锁进行写的操作。

二:根据系统并发情况,锁分为以下两种

悲观锁和乐观锁。

2.1悲观锁:

所谓的悲观锁:顾名思义,就是很悲观,每次去修改数据的时候都认为别人也会去修改相同的书,所以每次修改数据的时候都会上锁。这样别人修改数据的时候就要等待直到锁的释放。以保证数据的一致性。

悲观锁有两种方式(从SQL语句的区别来看):

1. 执行select xxx for update操作时,数据会被锁定,只有执行comit或rollover才会释放

2. 执行select xxx for update nowait操作时,数据也会被锁定,其他人访问时或返回ORA-00054错误,内容是资源正忙,需要采取相应的业务措施进行处理。

2.2乐观锁:

所谓的乐观锁:就是很乐观,每次去修改数据的时候都认为别人不会去修改相同的数据,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。

因此,需要在提交时保证数据一致性,如果不一致,则返回错误,由程序本身的逻辑进行处理。

乐观锁的实现主要有三种方式:

a. 通过比较提交前后的数据是否发生变化来判断是否存在数据冲突

b. 通过在表中增加版本戳列,来标示是否发生了变化

c. 通过比对表的时间戳来判断是否出现了版本变化

可以通过trigger或存储过程实现该乐观锁。

oracle在数据更新时通常时候的是乐观锁,任何一个以UPDATE...SET开始并且不是以SELECT...FOR UPDATE进行操作的命令就是一个乐观锁的例子。

悲观锁和乐观锁使用场景:

\1. 如果系统并发量不大且不允许脏读,可以使用悲观锁解决并发问题。

\2. 如果系统并发非常大的话,悲观锁会带来很大性能问题,所以一般采用乐观锁。

\3. 如果系统读比较多,写比较少,也应该使用乐观锁,可以提高吞吐量

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

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

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

(3) System Locks:保护内部数据库结构,例如Latches,mutexes,internal locks;

img

3.1 DML锁

DML锁(也称为数据锁)保证了多个用户并发访问的数据的完整性。

DML语句自动获取下列类型的锁:

3.1.1行锁(TX)

行级锁是粒度最细的DML锁,主要用来控制数据行的修改、删除操作。当对表中的某行数据进行修改时,需要对其加上行级排他锁,防止其他事物也对其进行修改,等数据修改完,事物提交时,自动释放。

3.1.2表锁(TM)

TM 锁用于确保在修改表的内容时,表的结构不会改变,例如防止在 DML 语句执行期间相关的表被移除。当用户对表执行 DDL 或 DML 操作时,将获取一个此表的表级锁。

当事务获得行锁后,此事务也将自动获得该行的表锁,以防止其它事务进行 DDL 语句影响记录行的更新。

TM 锁包括了 SS、 SX(RX)、 S、SRX(SSX)、 X 等多种模式,在数据库中用 0-6 来表示。不同的 SQL 操作产生不同类型的 TM 锁.

R是ROW行,S是SHARE共享,X是exclusive排他,独占锁的意思。

锁模式:0 锁描述:none

说明:没有锁,一般的SELECT,在表和行上都是0级锁

锁模式:1 锁描述:NULL

说明:Select有时会在v$locked_object出现。 其实起不了锁定的作用,他就是有一个通知的功能,根本阻止不了DDL,类似把执行计划中的对象通知对象所属的会话。

锁模式:2 锁描述:SS(Row-S)行级共享锁

说明:表结构共享锁,只跟X冲突,因为其他都是共享锁,RX,SRX虽然也有X,但是是行的X,表上还是共享的意思,2级锁在表级别和0-5级不冲突。

这个锁,也称为子共享表锁(SS),表示持有表上锁的事务已经锁定了表中的行,并打算更新它们。行共享锁是表锁中限制最少的一种模式,它为表提供了最高程度的并发性。

相关操作:Select for update,Lock For Update,Lock Row Share

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信dbaup66,谢谢!
AiDBA后续精彩内容已被站长无情隐藏,请输入验证码解锁本文!
验证码:
获取验证码: 请先关注本站微信公众号,然后回复“验证码”,获取验证码。在微信里搜索“AiDBA”或者“dbaup6”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复