相克军_Oracle体系_随堂笔记014-锁 latch,lock

1、Oracle锁类型
    锁的作用
    latch锁:chain,链
    LOCK锁
        排他锁(X)
        共享锁(S)

2、行级锁:DML语句
    事务锁TX
        锁的结构
        事务锁的加锁和解锁过程
    只有排他锁
        不影响读(CR块)

3、表级锁:TM
    行级排他锁(Row exclusive)RX锁
        当我们进行DML时,会自动在被更新的表上添加RX锁,可以执行LOCK命令显式的在表上添加RX锁
        允许其他事务通过DML语句修改相同表里的其他数据行
        允许使用lock命令对表添加RX锁定
        不允许其他事务对表添加X锁
    行级共享锁(Row Shared,简称RS锁)
        select … from for update
    共享锁(Share,简称S锁)
        通过lock table in share mode命令添加该S锁
    排他锁(Exclusive,简称X锁)
        通过lock table in exclusive mode命令添加X锁
    共享行级排他锁(Share Row Exclusive,简称SRX锁)
        通过lock table in share row exclusive mode命令添加SRX锁

4、锁的兼容性

5、加锁语句以及锁的释放

lock table  in [row share][row exclusive][share][share row exclusive][exclusive] mode;

6、锁相关视图
    v$transaction
        XIDUSN表示当前事务使用的回滚段的编号
        XIDSLOT说明该事务在回滚段头部的事务表中对应的记录编号(也可以叫做槽号)
        XIDSQN说明序列号
        STATUS说明该事务是否为活动的
    v$lock
        记录了session已经获得的锁定以及正在请求的锁定的信息
        SID说明session的ID号
        TYPE说明锁定锁定级别,主要关注TX和TM
        LMODE说明已经获得的锁定的模式,以数字编码表示
        REQUEST说明正在请求的锁定的模式,以数字编码表示
        BLOCK说明是否阻止了其他用户获得锁定,大于0说明是,等于0说明否
 
    锁定模式        锁定简称    编码数值  
    Row Exclusive        RX         3  
    Row Shared         RS        2  
    Share              S         4  
    Exclusive         X         6  
    Share Row Exclusive     SRX         5  
    NULL              N/A         0或者1  
 
    v$enqueue_lock
    该视图中包含的字段以及字段含义与v$lock中的字段一模一样。
    只不过该视图中只显示那些申请锁定,但是无法获得锁定的session信息。
    其中的记录按照申请锁定的时间先后顺序排列,先申请锁定的session排在前面,排在前面的session将会先获得锁定。
 
    v$locked_object
    记录了当前已经被锁定的对象的信息
    XIDUSN表示当前事务使用的回滚段的编号
    XIDSLOT说明该事务在回滚段头部的事务表中对应的记录编号
    XIDSQN说明序列号
    OBJECT_ID说明当前被锁定的对象的ID号,可以根据该ID号到dba_objects里查找被锁定的对象名称
    LOCKED_MODE说明锁定模式的数字编码
 
    v$session
    记录了当前session的相关信息
    SID表示session的编号
    SERIAL#表示序列号
    SID和SERIAL#可以认为是v$session的主键,它们共同唯一标识一个session

grant select on v_$mystat to hr; 
select sid from v$mystat where rownum=1; 
update employees set last_name=last_name||‘a‘ where department_id=60; 
select xidusn,xidslot,xidsqn,status from v$transaction; 
select sid,type,id1,id2,
decode(lmode,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) lock_mode,
decode(request,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) request_mode,
block
from v$lock
where sid=&sid; 
select object_name from dba_objects where object_id=&object_id; 

对于TM锁来说,ID1表示被锁定的对象的对象ID,ID2始终为0
    对于TX锁来说,ID1表示事务使用的回滚段编号以及在事务表中对应的记录编号,ID2表示该记录编号被重用的次数(wrap)
    
    将ID1拆解

select trunc(393249/power(2,16)) as undo_blk#,bitand(393249,to_number(‘ffff‘,‘xxxx‘)) + 0 as slot# from dual;      

再次打开一个session

select sid from v$mystat where rownum=1; 
update employees set last_name=last_name||‘b‘ where department_id=60; 
select sid, type, id1, id2,
decode(lmode,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) lock_mode,
decode(request,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) request_mode,block
from v$lock
where sid in(&sid1,&sid2)
order by sid;  

再次打开一个会话

select sid from v$mystat where rownum=1; 
update employees set last_name=last_name||‘c‘ where department_id=60; 

查询v$enqueue_lock来获得锁定队列中的session信息

select sid,type,
decode(request,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) request_mode
from v$enqueue_lock
where sid in(&sid1,&sid2); 
select a.sid blocker_sid, a.serial#, a.username as blocker_username, b.type,
decode(b.lmode,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) lock_mode,
b.ctime as time_held,c.sid as waiter_sid,
decode(c.request,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) request_mode,
c.ctime time_waited
from   v$lock b, v$enqueue_lock c, v$session a
where  a.sid = b.sid and    b.id1= c.id1(+) and b.id2 = c.id2(+) and c.type(+) = ‘TX‘ and  b.type = ‘TX‘ and  b.block   = 1
order by time_held, time_waited; 
alter system kill session ‘&sid,&serial‘; 

一个事务修改多行,产生一个TX锁

select sid from v$mystat where rownum=1; 
update employees set last_name=last_name||‘a‘ where department_id=60;
update departments set department_name=‘unknow‘ where department_id=10;
update locations set city=‘unknown‘ where location_id=1100;  
select sid, type, id1, id2,
decode(lmode,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) lock_mode,
decode(request,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) request_mode,block
from v$lock
where sid=&sid;  

可以获得的TX锁定的总个数由初始化参数transactions决定,而可以获得的TM锁定的个数则由初始化参数dml_locks决定

select name, value from v$parameter where name in(‘transactions‘,‘dml_locks‘); 
select resource_name as "R_N", current_utilization as "C_U", max_utilization as "M_U", initial_allocation as "I_U"
from v$resource_limit
where resource_name in(‘transactions‘,‘dml_locks‘); 

7、死锁
两个session(以A和C来表示),如果A持有C正在申请的锁定,同时C也持有A正在申请的锁定时,这时发生死锁现象。死锁是典型的“双输”情况,如果任其发展,则会出现A和C这两个session正在执行的事务都无法结束的现象。因此,在Oracle数据库中,造成死锁的那个DML语句会被撤销。死锁总是由于应用程序设计不合理引起的。
当某个session的事务引起了死锁时,Oracle会自动将阻塞该事务的其他事务中相应的DML语句撤销,而阻塞该事务的其他事务中的其他DML语句并没有撤销。
session 1

select sid from v$mystat where rownum=1;
update employees set last_name=last_name||‘a‘ where employee_id=100 

session 2

select sid from v$mystat where rownum=1;
update employees set last_name=last_name||‘b‘ where employee_id=101; 

session 1

update employees set last_name=last_name||‘c‘ where employee_id=101; 

session 2

update employees set last_name=last_name||‘d‘ where employee_id=100; 

相克军_Oracle体系_随堂笔记014-锁 latch,lock,布布扣,bubuko.com

时间: 2024-12-27 10:15:30

相克军_Oracle体系_随堂笔记014-锁 latch,lock的相关文章

相克军_Oracle体系_随堂笔记016-参数文件及数据库的启动和关闭

参数文件: spfile<SID>.ora    动态参数文件,是二进制文件,9i以后引入并建议使用 init<SID>.ora    静态参数文件,是文本文件 动态参数,部分参数可以动态修改.建议9i以后就使用spfile. 数据库启动三个阶段: nomount(根据参数文件配置参数启动实例) mount(根据参数文件中记录的控制文件位置打开控制文件) open(根据控制文件信息打开数据文件,redo日志文件,open数据库) 注:nomount之前就可以根据pfile创建spf

相克军_Oracle体系_随堂笔记010-SCN

1.SCN的意义?system change number 时间    先后.新旧 select dbms_flashback.get_system_change_number, SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number) from dual; SCN号,为了保证数据的一致性: 2.常见的SCN  2.1控制文件的三个SCN        系统SCN select checkpoint_change# from v$data

相克军_Oracle体系_随堂笔记003-体系概述

1.进程结构图 对Oracle生产库来讲,服务器进程(可以简单理解是前台进程)的数量远远大于后台进程.因为一个用户进程对应了一个服务器进程. 而且后台进程一般出问题几率不大,所以学习重点也是服务器进程和PGA的关系(容易出问题). 2.Oracle 实例管理 6大共享池,5大后台进程,3大文件 控制文件:记录了各文件存放的位置以及当前的运行状态: 数据文件:存放数据: 重做日志文件:对数据文件所有的修改记录: 补充知识点: (1)实际生产环境中可以多个实例(一般是2个,4个,8个)对应一个数据库

相克军_Oracle体系_随堂笔记015-网络原理及配置

oracle网络没有负载, 没有负载的就不容易出问题.相对很简单的. 1.监听的动态注册: PMON 注册监听,或者 alter system register; 强制PMON抓紧注册. 都属于动态注册~ 对应的listener.ora文件配置信息: LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.159)(PORT = 1521))) (DESCRIPTION

相克军_Oracle体系_随堂笔记011-事物

数据库主要实现的功能无非是以下三点: ①数据的一致性, ②数据的安全, ③数据的优化. 事物主要影响数据的一致性. 1.事务的基本概念    一组DML语句    insert.delete.update    COMMIT;    ROLLBACK;    SAVEPOINT <savepoint_name>     ROLLBACK TO [SAVEPOINT] <savepoint_name> 2.隐式提交和回滚    DDL    退出        异常退出      

相克军_Oracle体系_随堂笔记009-检查点队列

1.检查点队列 checkpoint queue RBA 日志块地址 redo block address LRBA 第一次被脏的地址 HRBA 最近一次被脏的地址 on disk rba 重做日志(current redo log)中最后一条日志的地址 数据块里有两个地址,LRBA,HRBA. checkpoint queue 按照脏块第一次脏的时间链起来. checkpoint queue就是按照数据块的LRBA地址链起来的. 2.CKPT进程    每隔3秒钟触发一次        记录检

相克军_Oracle体系_随堂笔记012-undo

undo表空间中undo段是自动生成的,oracle自动使用undo表空间的undo段. 作为高级DBA,需要了解Oracle是如何使用undo段的.这样出了性能问题才能够解决. 1.Undo表空间及管理方式 show parameter undo_tablespace show parameter undo Undo段 select * from v$rollname; select SEGMENT_NAME,BLOCKS,EXTENTS from dba_segments where SEG

相克军_Oracle体系_随堂笔记013-字符集

linux环境下: [[email protected] ~]# locale LANG=en_US.UTF-8 LC_CTYPE="en_US.UTF-8" …… windows环境下: C:\Users\Martin>chcp 活动代码页: 936 字符集其实就是“字符”和“编码”的一张对照表, 数据库安装过程中,会选择确认下面两个字符集: 1.数据库字符集:数据库需要存储多国语言选择AL32UTF8,只有中英文选择ZHS16GBK 2.国家字符集 一般都选用AL16UTF1

相克军_Oracle体系_随堂笔记006-日志原理

简单来说,学习Oracle数据库就两个目标: 保证数据库数据的一致性: 提高数据库的性能(这个和日志没关系). 日志的功能: 只是保证数据库数据的一致性: 1.Oracle日志原理    史记讲解法    日志记录方式2.实际日志产生过程3.归档模式 alter database archivelog ARCHIVE LOG LIST SELECT log_mode FROM v$database alter database noarchivelog ALTER SYSTEM ARCHIVE