Oracle锁的面试题有哪些?

分类:编程技术 时间:2024-02-20 15:46 浏览:0 评论:0
0
本文介绍了《Oracle锁面试题有哪些》的相关知识。在实际案例操作过程中,很多人都会遇到这样的困境。接下来就让小编带领大家学习一下如何处理这些情况。酒吧!我希望你能仔细阅读并学到一些东西!

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

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

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

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

Oracle 锁存储在哪里?

在Oracle数据库中,不存在真正属于对象或数据的锁。 Oracle锁信息是数据块的物理属性,而不是逻辑上属于表或行。 Oracle的锁机制是一种轻量级的锁机制,它不通过构建锁列表来进行数据锁管理,而是直接将锁作为数据块的属性存储在数据块头中。在Oracle数据库中,它不会锁定某个表或锁定某些行。锁作为数据块的属性而存在。换句话说,每个数据块本身存储了有关数据i的信息n 它自己的数据块。这个地方叫做ITL(Interested Transaction List)。每当这个数据块上有一个活跃的交易时,它的信息就会被记录在这里。为后续操作查询保证事务一致性。

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

排它锁(X锁) )和共享锁(S 锁)。

1.1 排它锁事务设置排它锁后,该事务单独获取此资源,另一个事务在该事务提交之前无法获得同一个对象的共享锁或独占锁。

可以理解为写锁。这种锁防止资源共享并用于修改数据。如果一个事物对某个数据加了排它锁,那么其他事物就不能对其加任何锁,直到该事物完成并且排它锁发行了。

1.2 共享锁共享锁使得一个事务可以共享对特定数据库资源的访问,而另一个事务可以也访问该资源或获取相同的共享锁。共享锁为事务提供了高并发性,很容易导致死锁和数据更新丢失。

可以理解为读锁。带有共享锁的数据只能共享读,不能加排他锁写。

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

悲观锁和乐观锁。

2.1悲观锁

所谓悲观锁:顾名思义,就是非常悲观,每一个当你修改数据的时候他们都认为别人会修改同一本书,所以每次修改数据的时候都会加锁。这样,当其他rs修改数据时,必须等到锁被释放。以保证数据的一致性。

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

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

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

2.2乐观锁

所谓乐观锁:就是非常乐观,每次修改数据时,都假设其他人不会修改相同的数据,因此不会被锁定。但更新时会判断本次期间其他人是否更新过数据碘。

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

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

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

b.添加到表格添加版本戳列以指示是否发生更改

c.通过比较表的时间戳来判断是否发生版本变更

这种乐观可以通过触发器或存储过程来实现。锁。

Oracle在更新数据时通常使用乐观锁。任何以 UPDATE...SET 开头且不使用 SELECT...FOR UPDATE 操作的命令都是乐观锁定的一个示例。

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

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

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

3.如果系统读多写少,也应该使用乐观锁来提高吞吐量。

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

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

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

(3)系统锁:保护内部数据库结构。

3.1 DML锁

DML锁(又称数据锁)保证多个用户并发访问数据的安全性。正直。

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

3.1.1行锁 (TX)

< p>行级锁是最细粒度的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 锁定描述:无

说明:无锁定。一般SELECT对表和行有0级锁 p>

锁定模式:1 锁定描述:NULL

说明:Select有时出现在v$locked_object中。事实上,它并没有起到锁定的作用。它只是有一个通知功能,根本无法阻止DDL。类似于在执行计划中通知该对象所属的会话。

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

描述:表结构共享锁,仅与X冲突,因为其他的都是共享锁,虽然RX和SRX也有

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

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

锁方式:3 锁描述:SX(Row-X)行级排它锁< /p>

strong>

说明:表结构共享锁+正在操作的记录的排它锁(如果有DML操作),这个锁又叫子排它表锁( SX),通常表示持有此锁的事务已更新表行或发出 SELECT...for update。 SX 锁允许其他事务同时查询、插入、更新、删除或锁定同一表中的行。因此,SX锁允许多个事务获取SX和子共享表锁同时在同一张桌子上。

相关操作:Insert、Update、Delete、Lock Row Exclusive

锁方式:4 锁描述:S(Share)共享锁

说明:表结构共享锁+所有记录共享锁(隐含),一个事务持有的共享表锁允许其他事务查询该表(除了SELECT...for update),但仅限于单个事务持有时共享表锁允许更新。因为多个事务可能同时持有一个共享表锁,持有这个锁并不足以保证一个事务可以修改表。

相关操作:创建索引、锁共享

锁方式:5 锁描述:SRX(S/Row-X)共享行级排它锁

说明:表结构共享锁+所有记录排他锁(隐含),这种锁又称为共享-子排他表锁(SSX),比共享锁限制性更强。只能获得一笔交易n 一次对给定表进行 SSX 锁定。事务持有的SSX锁允许其他事务查询表(除了SELECT...for update)但不能更新表。

相关操作:Lock Share Row Exclusive

锁方式:6 锁描述:X(Exclusive)排它锁

说明:表结构排他锁。此锁是最严格的,禁止其他事务执行任何类型的 DML 语句或在表上放置任何类型的锁。

相关操作:Alter table、Drop table、Drop Index、Truncate table、Lock Exclusive

这些模式看起来是不是特别混乱、难以理解?网上有一个简单易懂的例子如下:

http://blog.itpub.net/30126024/viewspace-2156232/< /p>

参考麦克林的讲座,用珠宝店来比喻:

珠宝店可以免费参观,也可以预约。你可以尝试一下,如果感觉不错的话就购买。您可以购买整个商店。

类别0人,免费参观珠宝店的人

类别1人,免费参观珠宝店的人

类别1人,免费参观珠宝店的人体弱、生病或怀孕的顾客

第2类人已预订试用期并先购买几天。如果尝试后感觉好一些,就可以再次购买

第3类人直接去商店立即购买

类型4人把整个店的珠宝打包起来供别人参观和预订,但不能买卖(这在ORACLE中称为只读锁,只允许别人读,即,只允许第0个。类型1和类型2的人来到珠宝店,以只读方式让其他人参观。不允许买卖。类型4的人仍然允许,因为虽然每个人都想b嗯,他们的目的是分享,而不是垄断。 ,所以他们是兼容的)

5型人,他们和4型人只有一个区别,那就是5型人接管整个珠宝店后,另一种类型5的人不允许重新打包(这在ORACLE中称为写锁),即类型5的人是单通道的。你在珠宝店里只能找到1个5型人,而且根本不可能找到一个。还有第二个5型人,但5型人接管珠宝店后,仍然可以让0、1、2型人参观,但不允许买卖。

< p>第六章人形它已经拿下了整个珠宝店,并且不允许任何人有目的地参观它。它只允许免费参观。排他性,只允许0类和1类人员参观,其他人不允许参观
p>

--以上类型2人员进行了预约,所以类型3不兼容6型人

--以上3型人想买珠宝,所以3型和4型、5型和6型人不兼容。

3.2 DDL锁

当正在进行的DDL操作作用于或引用对象时,数据字典(DDL)锁保护模式对象的定义。

在 DDL 操作期间,仅锁定修改或引用的单个架构对象。数据库永远不会锁定整个数据字典。

Oracle 数据库会自动代表任何需要 DDL 锁的 DDL 事务获取 DDL 锁。用户无法显式请求 DDL 锁。例如,如果用户创建存储过程,Oracle 数据库会自动获取过程定义中引用的所有模式对象的 DDL 锁。 DDL 锁可防止这些对象在过程编译完成之前被更改或删除。

3.2.1 DDL独占本地k

独占DDL锁阻止其他会话获取DDL或DML锁。

大多数 DDL 操作需要资源上的独占 DDL 锁,以防止对可能修改或引用同一架构对象的其他 DDL 操作造成破坏性干扰。例如,当 ALTER TABLE 添加列时,DROP TABLE 不允许删除表,反之亦然。

3.2.2 DDL 共享锁

资源上的共享 DDL 锁可防止冲突 DDL 操作的破坏性干扰,但允许类似的 DDL操作 执行数据并发。

这些锁保护引用对象的结构不被其他会话修改,但允许修改数据。

例如,当运行 CREATE PROCEDURE 语句时,包含的事务将获取所有引用表的共享 DDL 锁。其他事务可以并发创建引用同一个表的过程并获取并发同一表上的共享 DDL 锁,但任何事务都无法获取任何引用表上的独占 DDL 锁。

共享DDL锁在DDL语句执行和自动提交期间有效。因此,持有共享 DDL 锁的事务可保证所引用的模式对象的定义在事务期间保持不变。

3.2.3 DDL可解析解析锁

解析锁称为可解析解析锁。因为它不禁止任何DDL操作并且可以分解以允许冲突的DDL操作。

这些锁允许一个对象(例如缓存在共享池中的查询计划)注册其与另一对象的依赖关系。如果对依赖对象执行 DDL,Oracle 将查看已注册该对象的依赖关系的对象列表,并使这些对象无效。因此,这些锁是“可分解的”,它们并不能阻止DDL的发生。

<强g>3.3 系统锁

Oracle数据库使用各种类型的系统锁来保护内部数据库和内存结构。这些机制对用户来说是透明的。

3.3.1 锁存器

锁存器是一种简单的低级序列化机制,用于协调多用户访问共享数据结构、对象和文​​件。

一般来说,一个latch由三个内存元素组成:pid(进程id)、内存地址和内存长度。 Latch保证对共享数据结构的独占访问,以保证内存结构的完整性不被破坏。当多个会话同时修改或检查sga中的同一内存结构时,访问必须串行化,以保证sga中数据结构的完整性。闩锁不会造成阻塞,而只会等待。当前进程释放latch后,如果有多个其他进程同时请求,就会发生竞争它们之间。没有排队机制。一旦前面的进程释放了锁,后面的进程就会没有先来先服务的概念,而且这一切发生得非常快,因为Latch的特点就是速度快而且寿命短。

Latch争用大多取决于系统和数据库本身的设计问题,比如绑定变量、热块、参数设置是否合理等。

例如多个用户删除或修改主键、是否有用户使用语法select...for update、外键是否创建索引等。

锁存器保护共享内存资源在被多个进程访问时不被损坏。具体来说,锁存器可以保护数据结构免受以下影响:

•多个会话并发修改

•当被一个会话读取并被另一个会话修改时

• 释放重新分配访问时的内存

通常,单个锁存器保护多个对象在SGA中,例如后台进程(如DBWn和LGWR)从共享池(shared pool)分配内存来创建数据结构。为了分配此内存,这些进程使用共享池锁存器来串行化访问,从而防止两个进程同时检查或修改共享池。分配内存后,其他进程可能需要访问共享池,例如库缓存,进行解析。此时进程latch只锁定library cache,并不会锁定整个shared pool。

与队列锁(例如行锁)不同,锁存器不允许会话排队。当闩锁可用时,发起请求的第一个会话将获得闩锁。当一个进程在循环中重复请求一个闩锁时,称为闩锁旋转,当一个进程在等待闩锁的同时休眠以释放CPU时,称为闩锁睡眠。

通常,Oracle 进程仅在很短的时间内获取锁存器当操作或查看数据结构时。例如,当处理员工的工资更新时,数据库可以获取和释放锁数千次。锁存器的实现取决于操作系统,特别是如何处理锁存器等待。

锁存器的增加意味着并行性的降低,例如太多的硬操作竞争库缓存锁存器。 V$LATCH 视图包含每个锁存器使用情况的统计信息,包括每个锁存器的请求数和等待数。

3.3.2 Mutexes

Mutex作为Latch的替代品,具有获取速度快、体积小等优点。

获取互斥量大约需要30~35条指令,而Latch需要150~200条指令。互斥结构的大小约为 16 字节,而锁存器在 10.2 版本中需要 112 字节,在早期版本中需要 200 字节。

互斥体(mutex)是一种低级机制,可以防止内存中的对象再次出现g 或在被并发进程访问时被损坏。互斥体类似于锁存器,但锁存器通常保护一组对象,而互斥体保护单个对象。

互斥锁有几个好处:

•互斥锁可以减少争用。

由于闩锁保护多个对象,因此当多个进程尝试同时访问这些对象时,它可能会成为瓶颈。互斥体通过序列化对单个对象而不是组的访问来减缓争用。

•互斥锁比锁存器消耗更少的内存。

•在共享模式下,互斥体允许多个会话同时引用它。

3.3.3 内部锁

内部锁比闩锁和互斥锁更先进、更复杂。各种目的。

数据库使用以下类型的内部锁:

• 字典缓存锁

这些锁的持续时间非常短, 一个d 当字典缓存的条目被修改或使用时,它们确保解析的语句不会看到不一致的对象定义。字典缓存锁可以是共享的或独占的。共享锁在解析完成时释放,而独占锁在DDL操作完成时释放。

•文件和日志管理锁

这些锁保护各种文件。例如,内部锁保护控制文件,以确保一次只有一个进程可以修改它。另一个锁协调联机重做日志文件的使用和归档。数据文件被锁定,以保证多个实例以共享模式挂载数据库,或者一个实例以独占模式挂载数据库。因为文件锁和日志锁指示文件的状态,所以这些锁必须保持很长时间。

•表空间和撤消段锁

这些锁保护表空间和撤消段。例如,所有实例 ac访问数据库必须就表空间是在线还是离线达成一致。 undo 段被锁定,以确保只有一个数据库实例可以写入undo。

《Oracle锁面试题有哪些》介绍到这里。感谢您的阅读。如果您想了解更多行业资讯,可以关注网站,小编将为大家输出更多优质实用文章!

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > Oracle锁的面试题有哪些?

用户评论