设为首页 加入收藏

TOP

锁的基本原理(一)
2015-11-21 01:44:39 来源: 作者: 【 】 浏览:0
Tags:基本 原理
oracle032
锁的基本原理
1、Oracle锁类型
锁的作用:保护数据,没有锁就没有并发,锁是用来限制并发的
数据库反应慢不一定是数据负严重,也可能是锁的原因阻止了事务的进行:开两个客户端修改数据会明显发现第二个会很慢就是因为第一个用户锁住了行记录

latch锁:chain,链(server Pro 并发访问时就通过获取latch锁来进行保护链)
LOCK锁:buffer 、数据块、数据行
排他锁(X):就是A访问加锁X而B就不能访问加锁了
共享锁(S):就是A、B都可以加相同的共享S锁
2、行级锁:DML语句;是LOCK锁的最小粒度锁;oracle特有也最影响并发的效率的
事务锁TX:一个事务一个事务锁,是因为行级锁产生的
锁的结构
事务锁的加锁和解锁过程:DML语句(加锁);commit/rollback(解锁)
只有排他锁(行级锁和事务锁都是排他锁的类型)
不影响读(CR块)
3、表级锁:TM

行级排他锁(Row exclusive)RX锁
当我们进行DML时,会自动在被更新的表上添加RX锁,可以执行LOCK命令显式的在表上添加RX锁
允许其他事务通过DML语句修改相同表里的其他数据行
允许使用lock命令对表添加RX锁定
不允许其他事务对表添加X锁 \
行级共享锁(Row Shared,简称RS锁)
select … from for update 是会产生一个事务,和普通DML语句一样产生行级锁,并在表级别加了一个RS锁没加RX锁;但实际并没有修改数据
共享锁(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锁

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

研究锁侧重于两点:锁的兼容性,锁的产生原因
4、锁的兼容性 \
5、加锁语句以及锁的释放 \
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 测试锁:
开启3个session:

SQL> select sid from v$mystat where rownum=1;

SID
----------
29

SQL>

SQL> select sid from v$mystat where rownum=1;

SID
----------
35

SQL>


SQL> select sid from v$mystat where rownum=1;

SID
----------
38

SQL>

使用sessionID为29进行更新t表操作
SQL> update t set name='qq' where id = 2;

1 row updated.

SQL>
查询事务: select xidusn,xidslot,xidsqn,status from v$transaction;
5 30 1099 ACTIVE
说明当前存在一个活动的事务

下面是查询sessionID为29的连接所产生的事务信息:
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=29;

SID, TYPE, ID1, ID2, LOCK_MODE, REQUEST_MODE, BLOCK
29 AE 100 0 Share None 0
29 TM 74585 0 Row Exclusive None 0//表级锁
29 TX 327710 1099 Exclusive None 0//行级锁
SID表示sessionID,TYPE表示锁的类型,ID2表示事务槽被覆盖的次数,ID1中的信息包含两种信息:1.事务表 2.事务表中行
通过:
将ID1拆解
select trunc(327710/power(2,16)) as undo_blk#,bitand(327710,to_number('ffff','xxxx')) + 0 as slot# from dual; UNDO_BLK#, SLOT# 5 30//显示的是该事务的信息,这也说明了ID1表示了两种信息的说法。 LOCK_MODE表示锁的模式,REQUEST_MODE是否请求锁,BLOCK表示锁住哪个事务 select OWNER,OBJECT_NAME,OBJECT_ID,OBJECT_TYPE,CREATED,LAST_DDL_TIME,STATUS,NAMESPACE from dba_objects where object_id=74585;//被锁的对象
OWNER, OBJECT_NAME, OBJECT_ID, OBJEC
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Greenplum+Hadoop学习笔记-13-客.. 下一篇ADO.NET(OleDb)读取Excel表格时的..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: