oracle锁的使用

一、查询使用

1. 加锁的目的:实现对 '共享资源''并发控制'
   例如,'同时' 更新 '同一条记录'
       若不加锁,则更新无先后顺序,得到的结果集可能并非想要的
       若加了锁,则更新有先后顺序,能得到想要的结果集   
2. 锁的分类:从不同的角度,有不同的分类方法
3. 相关视图
   (1) select * from v$locked_object; -- 查询 dml 锁信息
   (2) select * from dba_ddl_locks;   -- 查询 ddl 锁信息
   (3) select * from v$lock;          -- 查询所有锁信息

二、锁的类型

1. 隐式锁(自动锁): Oracle 系统自行维护,无需人为干预,常见有
   (1) DDL 语句:createalter 等
   (2) DML 语句:insertupdatedeleteselect ... for update   
2. 显式锁: 人为手动添加锁,lock table ... [nowait]
   (1) lock table <table_name> in row share mode nowait;     -- 2:rs
   (2) lock table <table_name> in share update mode nowait;  -- 2:rs
   (3) lock table <table_name> in row exclusive mode nowait; -- 3:rx
   (4) lock table <table_name> in share mode nowait;         -- 4:s
   (5) lock table <table_name> in share row exclusive mode;  -- 5:srx
   (6) lock table <table_name> in exclusive mode nowait;     -- 6:x

2.2 按锁级别划分: 共享锁和排他锁

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


图表解释说明:

(1) 如果 事务T 对 数据A 加上 '共享锁' 后,则其它事务只能对 A 再加 共享锁,不能加 排他锁
(2) 如果 事务T 对 数据A 加上 '排他锁' 后,则其它事务不能再对 A 加任任何类型的锁
2. 能否读取和修改数据
(1) 获得 '共享锁' 的事务只能读数据,不能修改数据
(2) 获准 '排他锁' 的事务既能读数据,又能修改数据

查询是否有锁,

方法一:通过管理员权限用户查询被锁表信息

select t2.username,
        t2.sid,
        t2.serial#,
        t3.object_name,
        t2.OSUSER,
        t2.MACHINE,
        t2.PROGRAM,
        t2.LOGON_TIME,
        t2.COMMAND,
        t2.LOCKWAIT,
        t2.SADDR,
        t2.PADDR,
        t2.TADDR,
        t2.SQL_ADDRESS,
        t1.LOCKED_MODE
 from v$locked_object t1, v$session t2, dba_objects t3
 where t1.session_id = t2.sid
 and t1.object_id = t3.object_id
 order by t2.logon_time;

方法二:’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')  -- 只需要关注 TM / TX 锁即可
-- AND s.username = ''
;

2.3 按保护对象划分:DML、DDL、SYSTEM

1. DML Locks: 保护 '数据',如:表锁锁定整个表、行锁锁定选中的行
  (1) TM 锁(表级锁)
  (2) TX 锁(事务锁 或 行级锁)
2. DDL Locks: 保护 '对象的结构',如:表、视图的定义
3. System locks: 保护数据库 '内部的结构',如:数据文件、闩


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

详细的解释可以参考 Oracle 官方文档 v$locked_object 中的 locked mode 链接(Oracle Database Concepts …)

select t.locked_mode, t.* from v$locked_object t;

锁模式 简称 全称 解释 常用 sql 操作

0    none    lock requested but not yet obtained    已请求锁,但未获得    
1    null    查询    select
2    rows_s(ss)    row share lock    行级共享锁    
3    row_x(sx)    row exclusive table lock    行排它表锁    insertupdatedelete
4    share(s)    share table lock    共享表锁    
5    s/row-s(ssx)    share row exclusive table lock    共享行独占表锁    
6    exclusive(x)    exclusive table lock    排它表锁    alter tabledrop tabledrop indextruncate table
lock table 的方式,同上 “2.1 按用户与系统划分:隐式锁和显式锁”

3 扩展

死锁

死锁原因:互相等待对象释放资源。 -- 我让你先走,你让我先走,结果大家都不走
解决办法:找到 'SID''SERIAL#',并执行下列语句
alter system kill session 'SID, SERIAL#';

 

详细可见:https://blog.csdn.net/m0_37253968/article/details/120408685
     http://t.zoukankan.com/smellpawn-p-10799174.html

posted @ 2022-05-12 11:44  潜摩羯  阅读(335)  评论(0编辑  收藏  举报