Oracle:锁处理
2022/1/13 19:08:12
本文主要是介绍Oracle:锁处理,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一:解决方案
--查询锁 select t.SID, t.SERIAL#, t2.OBJECT_TYPE, t.USERNAME ORACLE_USER, t2.OBJECT_NAME, t.OSUSER, t.MACHINE, t3.SQL_TEXT from v$session t, v$locked_object t1, dba_objects t2, v$sql t3 where t.SID = t1.SESSION_ID AND t1.OBJECT_ID = t2.OBJECT_ID AND t3.SQL_ID = t.SQL_ID; --解锁(sid:2038 serial#:52937) alter system kill session '2038,52937';
有趣的一些视图:v$lock、v$locked_object、v$session、v$dba_objects、v$sql
二:锁机制
DML、DDL和DCL含义: DML(Data Manipulation Language,数据操作语言):用于检索或者修改数据。 DML包括: SELECT INSERT UPDATE DELETE DDL(Data Definition Language,数据定义语言): 用于定义数据的结构,比如 创建、修改或者删除数据库对象。 DDL包括:DDL语句可以用于创建用户和重建数据库对象。下面是DDL命令: CREATE TABLE ALTER TABLE DROP TABLE CREATE INDEX DROP INDEX DCL(Data Control Language,数据控制语言):用于定义数据库用户的权限。 DCL包括: ALTER PASSWORD GRANT REVOKE CREATE SYNONYM
1、Oracle数据库的锁类型
根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护数据库的内部结构。
1)DML锁:目的在于保证并发情况下的数据完整性。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。
当Oracle 执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X 等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。
4个常见的dml语句会产生阻塞:INSERT、UPDATE、DELETE、SELECT…FOR UPDATE。(Insert发生阻塞的唯一情况就是用户拥有一个建有主键约束的表。当2个的会话同时试图向表中插入相同的数据时,其中的一个会话将被阻塞,直到另外一个会话提交或会滚。一个会话提交时,另一个会话将收到主键重复的错误。回滚时,被阻塞的会话将继续执行;UPDATE 、DELETE当执行操作的数据行已经被另外的会话锁定时,将会发生阻塞,直到另一个会话提交或会滚;Select …for update
当一个用户发出select..for update的错作准备对返回的结果集进行修改时,如果结果集已经被另一个会话锁定,就是发生阻塞。需要等另一个会话结束之后才可继续执行。可以通过发出 select… for update nowait的语句来避免发生阻塞,如果资源已经被另一个会话锁定,则会返回以下错误:Ora-00054:resource busy and acquire with nowait specified.)
2、悲观锁和乐观锁
(1)悲观锁
锁在用户修改之前就发挥作用:Select ..for update(nowait)、Select * from tab1 for update。
用户发出这条命令之后,oracle将会对返回集中的数据建立行级封锁,以防止其他用户的修改。
如果此时其他用户对上面返回结果集的数据进行dml或ddl操作都会返回一个错误信息或发生阻塞。
1):对返回结果集进行update或delete操作会发生阻塞。
2):对该表进行ddl操作将会报:Ora-00054:resource busy and acquire with nowait specified.
原因分析:
此时Oracle已经对返回的结果集上加了排它的行级锁,所有其他对这些数据进行的修改或删除操作都必须等待这个锁的
释放,产生的外在现象就是其他的操作将发生阻塞,这个这个操作commit或rollback.同样这个查询的事务将会对该表加表级
锁,不允许对该表的任何ddl操作,否则将会报出ora-00054错误::resource busy and acquire with nowait specified.
(2)乐观锁
乐观的认为数据在select出来到update进取并提交的这段时间数据不会被更改。这里面有一种潜在的危险就是由于被选出的结果集并没有被锁定,是存在一种可能被其他用户更改的可能。因此Oracle仍然建议是用悲观封锁,因为这样会更安全。
阻塞
定义:
当一个会话保持另一个会话正在请求的资源上的锁定时,就会发生阻塞。被阻塞的会话将一直挂起,直到持有锁的会话放弃锁定的资源为止。
这篇关于Oracle:锁处理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-11国产医疗级心电ECG采集处理模块
- 2025-01-10Rakuten 乐天积分系统从 Cassandra 到 TiDB 的选型与实战
- 2025-01-09CMS内容管理系统是什么?如何选择适合你的平台?
- 2025-01-08CCPM如何缩短项目周期并降低风险?
- 2025-01-08Omnivore 替代品 Readeck 安装与使用教程
- 2025-01-07Cursor 收费太贵?3分钟教你接入超低价 DeepSeek-V3,代码质量逼近 Claude 3.5
- 2025-01-06PingCAP 连续两年入选 Gartner 云数据库管理系统魔力象限“荣誉提及”
- 2025-01-05Easysearch 可搜索快照功能,看这篇就够了
- 2025-01-04BOT+EPC模式在基础设施项目中的应用与优势
- 2025-01-03用LangChain构建会检索和搜索的智能聊天机器人指南