锁是面试中经常问到的题,在工作中也经常会碰到相关的问题。
锁是用于管理并发访问数据库对象的机制。锁可以防止多个会话同时修改同一个对象,从而确保数据的一致性和完整性。也就是事务只能被一个线程占用。只有这个锁释放了,其他线程才能占用。
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
573次阅读
2025-04-15 17:24:06
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
518次阅读
2025-04-18 14:18:38
Oracle SQL 执行计划分析与优化指南
Digital Observer
479次阅读
2025-04-01 11:08:44
墨天轮个人数说知识点合集
JiekeXu
465次阅读
2025-04-01 15:56:03
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
463次阅读
2025-04-08 09:12:48
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
446次阅读
2025-04-22 00:20:37
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
445次阅读
2025-04-20 10:07:02
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
423次阅读
2025-04-22 00:13:51
Oracle 19c RAC更换IP实战,运维必看!
szrsu
408次阅读
2025-04-08 23:57:08
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
392次阅读
2025-04-17 17:02:24