Oracle 锁详解(lock)

1 概述

锁 lock
一种机制:用于管理对共享资源的并发访问,保证数据的一致性和完整性
说明:咱不用太担心锁的问题,Oracle 会自我管理,但也允许 手动加锁
锁类型
DML 数据锁:保护 '数据' 的一致性和完整性
DDL 字典锁:保护 '数据库对象' 的结构
内部锁和闩(latch):保护 '数据库的内部结构'
锁模式
共享锁 Share Locks,即 S 锁
排他锁 Exclusive Locks,即 X 锁

2 锁详解

2.1 锁类型

1. DML:data locks,数据锁
   (1) 保护 '数据' 的一致性和完整性
   (2) insertupdatedelete
   (3) DML 锁主要有以下两种
       TM 锁(表级锁):锁住整个 '表'
       TX 锁(事务锁 或 行级锁) :锁住表中的 '某行'

2. DDL:dictionary locks,字典锁
   (1) 保护 '数据库对象' 的结构,如:表、索引等结构定义
   (2) createalter3. 内部锁和闩(latch)  
   (1) 保护 '数据库的内部结构'
   (2) latch:低级别、轻量级的锁,获得和释放的速度都快
       lock:可能持续很长时间,通过使用队列,先进先出的方式实现

2.2 锁模式

基本锁模式简称能否再加锁能否读数据能否改数据
共享锁Share Locks,即 S 锁×
排他锁Exclusive Locks,即 X 锁×

“锁模式” 值越大,所影响的行数越多

锁模式简称全称解释常用 sql 操作
0nonelock requested but not yet obtained已请求锁,但未获得
1null查询select
2rows_s(ss)row share lock行级共享锁
其他对象只能查询这些数据行
Select for update、Lock for update、Lock row share
3row_x(sx)row exclusive table lock行排它表锁
在提交前不允许做 DML 操作
Insert、Update、Delete、Lock row share
4share(s)share table lock共享表锁Create table、Lock share
5s/row-s(ssx)share row exclusive table lock共享行独占表锁Lock share row exclusive
6exclusive(x)exclusive table lock排它表锁Alter table、Drop table、Drop index、Truncate table 、Lock exclusive

2.3 查询

select l.sid,
       l.type,
       (select lt.name
          from v$lock_type lt -- type
         where lt.type = l.type) 锁类型,
       l.lmode,
       decode(l.lmode,
              0,
              null,
              1,
              'null (NULL)',
              2,
              'row-S (SS)',
              3,
              'row-X (SX)',
              4,
              'share (S)', -- s 锁:共享锁
              5,
              'S/Row-X (SSX)',
              6,
              'exclusive (X)' -- x 锁:排他锁
              ) 锁模式
  from v$lock l
 where l.type in ('TM', 'TX') -- 通常关注该两个即可
 order by l.sid;

3 扩展

3.1 select … for update 进阶

博客链接简述
Oracle for update skip locked 详解跳过被锁定的记录,锁定未被锁定的记录
Oracle for update [of column] [nowait] 详解多表连接时,锁定单个表中的某列

3.2 死锁

原因:互相等待对象释放资源。 -- 我让你先走,你让我先走,结果大家都不走

解决:找到 'SID''SERIAL#',并执行下列语句
     alter system kill session 'SID, SERIAL#';

’SID’ 和 ‘SERIAL#’ 获取方式

select l.sid         "会话ID",
       s.serial#     "会话序列号",
       p.spid        "会话进程号",
       l.type        "锁类型",
       s.username    "所属用户",
       s.machine     "客户端",
       o.object_name "被锁对象",
       o.object_type "被锁对象类型",
       l.ctime       "被锁时间(S)"
  from v$lock      l, -- addr
       v$session   s, -- saddr 
       dba_objects o, -- object_id 
       v$process   p -- addr 
 where s.sid = l.sid
   and o.object_id = l.id1
   and p.addr = s.paddr
   and l.type in ('TM', 'TX')
-- and s.username = ''
;
  • 7
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

鱼丸丶粗面

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

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

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

打赏作者

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

抵扣说明:

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

余额充值