暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

oracle锁

芃芃 2025-04-02
44


锁是面试中经常问到的题,在工作中也经常会碰到相关的问题。

锁是用于管理并发访问数据库对象的机制。锁可以防止多个会话同时修改同一个对象,从而确保数据的一致性和完整性。也就是事务只能被一个线程占用。只有这个锁释放了,其他线程才能占用。

9.1 事务
讲锁得先理解事务,事务是什么?

事务是最小的不可再分的工作单元,有DML语句产生。它有四个特征:

原子性:事务是最小单元,不可再分

一致性:事务要求DML的语句,必须保证全部同时成功提交或者同时失败回滚。

隔离性:事务A和事务B具有隔离性。

持久性:内存的数据持久到硬盘文件中。

开启事务:任何一条DML语句(insert、update、delete)执行,标志事务的开启。

事务结束:

提交:成功的结束,将所有的DML语句操作历史记录和底层硬盘数据来一次同步。

回滚:失败的结束,将所有的DML语句操作历史记录全部清空。

9.2 锁的定义
锁从需求上看分为:共享锁和排他锁。

共享锁:允许多个会话同时读取一个对象,但不允许任何会话修改该对象。这种锁适用于读取操作,可以提高并发性能。

排他锁:只允许一个会话同时对一个对象进行读取和修改操作。当一个会话持有排他锁时,其他会话无法读取或修改该对象。这种锁适用于写操作,可以确保数据的一致性。

细化从范围上看分为:表级锁和行锁。

表级锁:为了保证在修改表数据时,表的结构不会改变。在使用DDL或DML语句时产生。

行锁:使用DML时,会生成行锁,被修改的数据所在的行会被锁定,他人无法进行操作,属于排他锁。这时候也会自动生成该表的表级锁,不允许其他会话进行对该表DDL的操作。

从上锁的主动性和被动性上看分为:乐观锁和悲观锁。

乐观锁:数据库默认的。

悲观锁:需要通过for update提前占用数据的资源。

写法:select 语句 + for update;

在用户A修改之前就对返回的数据集进行上锁,防止其他用户的修改。如果用户B修改数据,那么他就会产生阻塞,需等到用户A事务结束。

悲观锁的缺点:主动加锁可能会导致时间过长,限制其他用户的访问。所以从并发性上看不推荐使用。

9.3 死锁原因及处理
死锁产生的原因:当两个用户互相希望持有对方的资源时就会发生死锁,也就是说两个用户互相等待对方释放资源时,这个时候就产生了死锁。

(举例易懂):

1:用户 1 对 A 表某行数据进行 Update,没有提交事务。

2:用户 2 对 B 表某行数据进行 Update,没有提交事务。

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

3:如果用户 2 此时对 A 表中那行数据作 update,则会发生阻塞,需要等到用户1的事务结束。

4:如果此时用户 1 又对 B 表的那一行数据作 update,也产生阻塞,等待用户2的事务结束。

这样双方都在等待对方释放锁资源,这就是死锁。

处理办法:只需释放掉其中一个资源即可。

--查看所有被上了锁的对象 69539

select * from v$locked_object;

--找到锁的对象,是在哪个表上面,根据自己找到的这个表的名字,回去找session_id 131

select * from dba_objects where object_id=69539;

--找锁的id的 serial# 9555

select * from v$session where sid=131;

--根据这两个编号,杀掉这个锁

alter system kill session '131,9555';
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_63021300/article/details/132267190

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论