Oracle 锁的概念以及分类

1.什么是锁

数据库是一个庞大的多用户数据管理系统, 同一时刻可能有多个用户同时操作。事务的分离性要求当前事务不能影响其他的事务,所以多个会话操作同一个资源时,数据库会利用锁确保他们像队列一样一次执行。利用来锁消除多个用户操作同一个资源产生的隐患。可以说,锁是一种机制,在访问相同资源时,可以防止事务之间的破坏性交互。Oracle处理数据时用到的锁是自动获取的,不需要对锁过多关注。

例如,当一个会话A对用户的账本金额做修改时,另一个会话B也要做修改账本金额操作。如果在没有任何处理的情况下就会出现脏读情况。如果使用了行级锁,会话A修改账本金额时锁改行,那么会话B就只能等待。这样就实现了依次处理
 

2.锁的分类

2.1 排它锁(X锁)

也叫写锁,这种模式防止资源共享,用作数据修改,如果事务T给数据A加上排它锁,那么其他事务就不能给A加任何锁。此时只允许事务T对数据做读取和修改

2.2 共享锁(S锁)

也叫读锁,这种模式只能被读取不能被修改。如果事务T给数据A加共享锁,那么其他事务不能给A加排它锁,只能加共享锁。加了锁的数据只能被共享读

3.锁的类型

3.1 内部闩锁

作用:保护数据库的内部结构。

3.2 DDL锁

DDL锁作用:可以保护模式中对象的结构。

DDL锁细分:

  • Excluseve DDL Lock ,排他DDL锁,对象加锁后不能被其他会话修改,如果是表此时可以读取数据
  • Shared DDL Lock,共享DDL锁,保护对象结构,会话不能修改对象结构,但是允许修改数据
  • Breakable Parsed Lock,能打破的解析锁定。这个类型的锁可以被大断,不能禁止DDL操作

会话执行DDL操作时,Oracle会自动的提交一次事务,然后自动给处理对象加锁,当DDL结束时,Oracle会隐式提交事务并释放DDL锁。用DML不同,用户不能显示的使用DDL锁。

3.3 DML锁

DML锁作用:用户保护数据,主要保证访问时数据的完整性

DML锁细分:

  • 行级锁(TX),也叫事务锁。当修改表中某行记录时。需要对将要修改的记录加行级锁。方式两个事务同时修改相同记录,事务结束锁释放,该锁属于排他锁
  • 表级锁(TM),主要作用是防止在修改表的数据时,表的结构发生变化。例如会话S在修改表A的数据时它会得到表A的TM锁,而此时不允许其他会话对该表进行变更或者删除。

会话在做DML操作的时候,数据库会先申请数据对象上的共享锁,防止其他会话对此对象做DDL操作。一旦申请成功。 则会对要修改的记录申请排它锁。(如果此时其他会话正在修改数据,则等待其他事务结束后再增加排它锁)

4.锁等待和死锁

由于占用资源不能及时释放,会造成锁的等待。例如,当一个会话S1修改记录A,A被加锁,如果另一个会话S2也来修改记录A,那么第二个会话将得不到排它锁会一直等待,知道会话S1事务提交释放锁,会话S2才能对数据进行操作。

死锁是锁等待的一个特征,加入,当会话S1需要修改2个资源,这2个资源在同一个事务里,修改第一个对象A时对其加锁,修改第2个对象B时另一个会话S2获取了锁并锁定了B,等待A释放锁,那么就出现了死锁。

当出现死锁的时候可以使用下面的SQL尝试处理,例如下面是之前遇到的一个问题,SID869修改DICTEN表,且锁住了表。 SID1393尝试修改DICTEN表时死锁一直等待

-查询当前的被锁对象
SELECT l.session_id sid,
       s.serial#,
       l.locked_mode 锁模式,
       l.oracle_username 登录用户,
       l.os_user_name 登录机器用户名,
       s.machine 机器名,
       s.terminal 终端用户名,
       o.object_name 被锁对象名,
       s.logon_time 登录数据库时间
FROM v$locked_object l, all_objects o, v$session s
WHERE l.object_id = o.object_id
   AND l.session_id = s.sid
ORDER BY sid, s.serial#;
 

 删除会话

--kill掉当前的锁对象语法格式
alter system kill session 'sid,s.serial#';
 
--例如:
alter system kill session '869,22889';

上一篇:Oralce ORA-00018超出最大会话数处理记录

  • 19
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Oracle中,要解住的表,可以按照以下步骤进行操作: 1. 首先,查看数据库,诊断的来源及类型。可以使用以下SQL语句查询信息: SELECT OBJECT_ID, SESSION_ID, LOCKED_MODE FROM V$LOCKED_OBJECT; \[1\] 2. 找出数据库的serial#,以备杀死。可以使用以下SQL语句查询被住的会话信息: SELECT T2.USERNAME, T2.SID, T2.SERIAL#, T2.LOGON_TIME FROM V$LOCKED_OBJECT T1, V$SESSION T2 WHERE T1.SESSION_ID = T2.SID ORDER BY T2.LOGON_TIME; \[2\] 3. 根据步骤2中查询到的会话信息,使用以下SQL语句杀死该会话: ALTER SYSTEM KILL SESSION 'sid,serial#'; (其中sid和serial#为步骤2中查询到的值)\[2\] 此外,还可以使用以下SQL语句查看哪个表被: SELECT b.owner, b.object_name, a.session_id, a.locked_mode FROM v$locked_object a, dba_objects b WHERE b.object_id = a.object_id; \[3\] 请注意,解表需要谨慎操作,确保只解正确的会话和表。 #### 引用[.reference_title] - *1* *3* [Oracle数据库表被如何查询和解详解](https://blog.csdn.net/qq_46071165/article/details/130104761)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Oracle中表被住及解方法](https://blog.csdn.net/u012934325/article/details/81015484)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

=PNZ=BeijingL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值