`
1enny
  • 浏览: 71303 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

锁的基本原理

 
阅读更多
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 TM745850 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, OBJECT_TYPE, CREATED, LAST_DDL_TIME, STATUS, NAMESPACE
SYS T 74585 TABLE 22-12月-14 04-1月 -15 VALID 1
对于TM锁来说,ID1表示被锁定的对象的对象ID,ID2始终为0
对于TX锁来说,ID1表示事务使用的回滚段编号以及在事务表中对应的记录编号,ID2表示该记录编号被重用的次数(wrap)

使用sessionID为35进行更新t表操作:
SQL> update t set name='ww' where id = 2;
//没有执行结果说明被锁住了
下面是查询sessionID为29、35的连接所产生的事务信息:
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(29,35)
order by sid;

SID, TYPE, ID1, ID2, LOCK_MODE, REQUEST_MODE, BLOCK
29 TM 74585 0 Row Exclusive None 0
29 AE 100 0 Share None 0
29 TX 327710 1099 Exclusive None 1//锁住了一个事务
35 TM 74585 0 Row Exclusive None 0
35 AE 100 0 Share None 0
35 TX 327710 1099 None Exclusive 0//请求一个排他锁,因为上面的29锁住了

使用sessionID为38进行更新t表操作:
SQL> update t set name='ww' where id = 2;
//没有执行结果说明被锁住了

查询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(35,38);

SID, TYPE, REQUEST_MODE
35 AE None
38 AE None
35 TX Exclusive
38 TX Exclusive
可以知道sessionID为35,38的连接需要锁为X锁

查询几个锁之间的关系:
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;

BLOCKER_SID, SERIAL#, BLOCKER_USERNAME, TYPE, LOCK_MODE, TIME_HELD, WAITER_SID, REQUEST_MODE, TIME_WAITED
29 557 SYS TX Exclusive 2452 38 Exclusive 274
29 557 SYS TX Exclusive 2452 35 Exclusive 712
BLOCKER_SID:锁的sessionID为29,BLOCKER_USERNAME:锁的用户名是sys,
TYPE:锁的类型为TX(行级锁)LOCK_MODE:锁的模型为排他锁,TIME_HELD:锁所持续的时间
WAITER_SID:该锁被哪个sessionID锁等待,REQUEST_MODE:请求锁的类型,TIME_WAITED:请求时间
通过上面的信息就可以知道某个连接所持有的锁时间,假如时间过长说明该连接存在问题,就可以杀掉该连接
alter system kill session '29,557';//第一个参数BLOCKER_SID,第二个为SERIAL#参数

一个事务修改多行,产生一个TX锁
select sid from v$mystat where rownum=1;

SQL> update t set name='rr' where id=2;

1 row updated.

SQL> update t set name='rr' where id=2;

1 row updated.

SQL> update t set name='rr' where id=2;

1 row updated.

SQL>

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=38;

SID, TYPE, ID1, ID2, LOCK_MODE, REQUEST_MODE, BLOCK
38 AE 100 0 Share None 0
38 TM 74585 0 Row Exclusive None 0
38 TX 327680 1099 Exclusive None 0

可以获得的TX锁定的总个数由初始化参数transactions决定,而可以获得的TM锁定的个数则由初始化参数dml_locks决定:
select name,value from v$parameter where name in('transactions','dml_locks');

NAME, VALUE
dml_locks 1084
transactions 271

查询资源的使用情况:
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');
R_N, C_U, M_U, I_U
dml_locks 1 1 1084
transactions 1 1 271
通过上面的参数可以知道dml_locks资源当前使用了1个而且最多的时候也只使用了1个,最大的资源数为1084
transactions同上,通过这个可以判断资源设置是否合理,假如M_U的值等于或者接近于I_U时说明需要增大I_U值因为:
可以获得的TX锁定的总个数由初始化参数transactions决定,而可以获得的TM锁定的个数则由初始化参数dml_locks决定
grant select on v_$mystat to hr;

死锁
两个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;

对HR用户进行解锁和密码设置:

SQL> select username,password,account_status from dba_users where username='HR';

USERNAME PASSWORD
------------------------------ ------------------------------
ACCOUNT_STATUS
--------------------------------
HR
EXPIRED & LOCKED//过期且被锁住的状态



SQL> alter user hr account unlock;

User altered.

SQL> select username,password,account_status from dba_users where username='HR';

USERNAME PASSWORD
------------------------------ ------------------------------
ACCOUNT_STATUS
--------------------------------
HR
EXPIRED//此时hr只是过期并没有被锁住


SQL> alter user hr identified hr;
alter user hr identified hr
*
ERROR at line 1:
ORA-00924: missing BY keyword


SQL> alter user hr identified by hr;

User altered.

SQL> select username,password,account_status from dba_users where username='HR';

USERNAME PASSWORD
------------------------------ ------------------------------
ACCOUNT_STATUS
--------------------------------
HR
OPEN//打开状态


SQL>




























分享到:
评论

相关推荐

    变电所防误操作闭锁装置基本原理及运行要求.doc

    变电所防误操作闭锁装置基本原理及运行要求.doc

    Mysql事务以及锁原理讲解

    本资源深入解释MySQL事务和锁的原理,涵盖了事务的基本概念、ACID特性、事务隔离级别以及MySQL中的锁类型、锁粒度等内容。通过实例和案例分析,详细讲解了事务的并发控制、隔离级别对数据一致性的影响,以及锁的使用...

    基于redis实现分布式锁的原理与方法

    系统的不断扩大,分布式锁是最基本的保障。与单机的多线程不一样的是,分布式跨多个机器。线程的共享变量无法跨机器。 为了保证一个在高并发存场景下只能被同一个线程操作,java并发处理提供ReentrantLock或...

    第九讲:分布式锁的原理及应用&秒杀设计实现.pdf

    分布式锁的基本概念  基本概念 * 多任务环境中才需要 * 任务都需要对同一共享资源进行写操作; * 对资源的访问是互斥的(串行化)  状态 * 任务通过竞争获取锁才能对该资源进行操作(①竞争锁); * 当有一个任务...

    Linux操作系统内核抢占补丁的基本原理

    CPU在内核中运行时并不是处处不可抢占的,内核中存在一些空隙,在这时进行抢占是安全的,内核抢占补丁的基本原理就是将SMP可并行的代码段看成是可以进行内核抢占的区域。2.4内核正好细化了多CPU下的内核线程同步机构...

    一文彻底理解ZooKeeper分布式锁的实现原理

    接下来我们一起来看看,多客户端获取及释放zk分布式锁的整个流程及背后的原理。 首先大家看看下面的图,如果现在有两个客户端一起要争抢zk上的一把分布式锁,会是个什么场景? 如果大家对zk还不太了解,建议先百度...

    MySQL优化学习总结:索引原理、基本架构、日志实现、执行计划、锁机制、读取分离等.zip

    MySQL优化学习总结:索引原理、基本架构、日志实现、执行计划、锁机制、读取分离等

    读写锁实现代码

    一般的读写锁代码,都是使用了临界体作为基本锁,这样就出现了在一个线程里获取临界体,但是却在另一个线程里释放临界体的问题。临界体是线程相关锁,必须做到获取和释放都在同一个线程。这个读写锁使用临界体和事件...

    80、单片机制作的电子密码锁(原理图、源代码、实物图、视频教学).rar

    除上述基本的密码锁功能外,还具有掉电存储、声光提示等功能,依据实际的情况还可以添加遥控功能。本系统成本低廉,功能实用。 系统总体设计和主要芯片介绍 系统主要芯片有STC89C52,AT24C02及液晶等 电子密码锁实现...

    STM32单片机原理

    STM32单片机原理,可以用于开发智能锁,智能灯炮,智能插座,

    Java使用Redisson分布式锁实现原理

    Redisson分布式锁 之前的基于注解的锁有一种锁是基本redis的分布式锁,这篇文章主要介绍了Java使用Redisson分布式锁实现原理,非常具有实用价值,需要的朋友可以参考下

    51电子密码锁 完整论文

    本系统由单片机系统、矩阵键盘、LED显示和... 本系统介绍了一种新型电子安全密码锁的应用背景、基本功能和要求,根据一种新型的编码状态机耦合工作原理,建立了电子锁的结构模型,给出了系统设计方案、硬件设计及程序流程

    基于51片机的电子密码锁设计.zip

    对电子密码锁的基本原理进行仿真设计

    毕业设计 - 遥控车位锁

    该资源设计内容包含遥控车位锁原理图,PCD,以及完整程序; 资料包括完整题目,芯片资料,以及所用到的单片机资料。 简单介绍题目内容: 运用所学的数字逻辑电路、模拟电子电路、单片机、测控电路等的基本知识,...

    滑动解锁 SlideUnlock 1.13

    软件具备失窃警报功能,当开启该功能,工作原理为:手机锁闭后将手机装入口袋或包内,感应器处于遮挡状态,失窃警报准备时过后会响一声准备好音,表示手机处于准备警报状态,当手机再次从口袋或者包内拿出,距离感应...

    usb加密狗破解基本原理及方法介绍

    硬件加密锁,俗程“加密狗”,对于加密狗的破解大致可以分为三种方法,一种是通过硬件克隆或者复制,一种是通过SoftICE等Debug工具调试跟踪解密,一种是通过编写拦截程序修改软件和加密狗之间的通讯。

    单片机课程设计__电子密码锁报告

    利用单片机灵活的编程设计和丰富的IO端口,及其控制的准确性,不但能实现基本的密码锁功能,还能添加调电存储、声光提示甚至添加遥控控制功能。其原理如图1-2所示。 图2-2单片机控制方案 通过比较以上两种方案,...

    基于51单片机的密码锁(6位,数码管,5组密码)proteus,原理图、流程图、物料清单、仿真图、源代码

    基本要求: 1.系统正常状态为等待6位密码输入状态,密码通过键盘输入,若密码正确,则 将锁打开(LED绿灯亮)(输入密码过程数码管以“*”显示输入位数),开锁后数码管以“0”闪烁显示,表明锁已打开: 2.通过特定按键...

    一种基于虚拟仪器技术的双锁相放大器的设计

    锁相放大器的基本原理是采用频谱迁移法抑制噪声,用调制器将交流或慢变信号的频谱迁移到调制频率处,再进行放大,以避开 1/f 噪声的不利影响。锁相放大器利用相敏检测技术,利用外部或内部产生的参考信号与被测信号...

    深入JVM内核 - 原理、诊断与优化

    在本课程中个,将详细介绍JVM的基本原理、组成以及工作方式,并配合实际案例,介绍相关的调优技巧。 课程大纲: 第一课 初识JVM JVM分类 Java语言规范 JVM规范 介绍JVM的基本知识和发展历史,并介绍了Java语言...

Global site tag (gtag.js) - Google Analytics