1. 锁的基本知识

根据要保护的对象不同,oracle的数据锁可以分成以下几类:DML锁,(data locks)数据锁,用于保护数据的完整性;DDL锁(dictionary locks),用于保护数据库内部结构,如表,索引等结构定义;内部锁和闩(internal locks and latcheds),保护数据库内部结构。

我们通常遇到的都是DML锁,DML锁在通常状态下都是用于保证并发情况下的数据完整性。在oracle中,主要包含有TM锁和TX锁,其中TM锁称为表级锁,TX锁称行级锁或事物锁。当oracle执行DML语句时,会自动在表上获取TM锁,TM锁获取之后,再自动获取TX锁,并将实际锁定的数据行的锁标志位进行置位,这样事务监察相容性时就不必逐行检查了,大大提高了效率。

那锁等待是如何出现的呢?

在数据行上只有X锁(排他锁),在oracle数据库中,当事物发起一个DML语句时就获取了一个TX锁,并保持到执行完毕或回滚。当多个会话在表的同一记录执行DML时,第一条会将记录加锁,其他会话等待。如发生了死锁,将会在oracle日志(alertSID.log)中看到ORA-60错误。

2. 悲观锁与乐观锁

悲观锁与乐观锁的区别在于悲观锁认为数据更新时一定会发生冲突,因此需要对记录加锁,以保证数据的一致性。oracle在数据更新时通常时候的是悲观锁,因其为行级锁,具有较好的性能,通常针对并发使用。

乐观锁与其不同,它认为数据不存在冲突,因此,需要在提交时保证数据一致性,如果不一致,则返回错误,由程序本身的逻辑进行处理。

乐观锁的实现主要有三种方式:

a. 通过比较提交前后的数据是否发生变化来判断是否存在数据冲突

b. 通过在表中增加版本戳列,来标示是否发生了变化

c. 通过比对表的时间戳来判断是否出现了版本变化

可以通过trigger或存储过程实现该乐观锁。

3.锁相关的视图

v$lock

v$lock

SID          会话的sid,可以和v$session 关联
TYPE 区分该锁保护对象的类型,如tm,tx,rt,mr等
ID1 锁表示1,详细见下说明
ID2 锁表示2,详细见下说明
LMODE 锁模式,见下面说明
REQUEST 申请的锁模式,同lmode
CTIME 已持有或者等待锁的时间
BLOCK 是否阻塞其他会话锁申请 1:阻塞 0:不阻塞

LMODE取值0,1,2,3,4,5,6, 数字越大锁级别越高, 影响的操作越多。

1级锁:  Select,有时会在v$locked_object出现。

2级锁即RS锁,相应的sql有:Select for update ,Lock xxx in  Row Share mode,select for update当对话使用for update子串打开一个游标时,所有返回集中的数据行都将处于行级(Row-X)独  占式锁定,其他对象只能查询这些数据行,不能进行update、delete或select for update操作。

3级锁即RX锁,相应的sql有:Insert, Update, Delete, Lock xxx in Row Exclusive mode,没有commit之前插入同样的一条记录会没有反应, 因为后一个3的锁会一直等待上一个3的锁, 我们必须释放掉上一个才能继续工作。

4级锁即S锁,相应的sql有:Create Index, Lock xxx in Share mode

5级锁即SRX锁,相应的sql有:Lock xxx in Share Row Exclusive mode,当有主外键约束时update/delete ... ; 可能会产生4,5的锁。

6级锁即X锁,相应的sql有:Alter table, Drop table, Drop Index, Truncate table, Lock xxx in Exclusive mode

ID1,ID2的取值含义根据type的取值而有所不同

对于TM 锁,ID1表示被锁定表的object_id 可以和dba_objects视图关联取得具体表信息,ID2 值为0

对于TX 锁,ID1以十进制数值表示该事务所占用的回滚段号和事务槽slot number号,其组形式:  0xRRRRSSSS,RRRR=RBS/UNDO NUMBER,SSSS=SLOT NUMBER

ID2 以十进制数值表示环绕wrap的次数,即事务槽被重用的次数

v$locked_objects

v$locked_object  

XIDUSN               undo segment number , 可以和v$transaction关联
XIDSLOT undo slot number
XIDSQN 序列号
OBJECT_ID 被锁定对象的object_id , 可以和dba_objects关联
SESSION_ID 持有该锁的session_id, 可以和v$session关联
ORACLE_USERNAME 持有该锁的oracle帐号
OS_USER_NAME 持有该锁的操作系统帐号
PROCESS 操作系统的进程号,可以和v$process关联
LOCKED_MODE 锁模式,含义同v$lock.lmode Dba_locks 和v$lock 内容差不多,略 V$session 如果某个session被因为某些行被其他会话锁定而阻塞,则该视图中的下面四个字段列出了这些行所属对象的相关信息
ROW_WAIT_FILE# 等待的行所在的文件号
ROW_WAIT_OBJ# 等待的行所属的object_id
ROW_WAIT_BLOCK# 等待的行所属的block
ROW_WAIT_ROW# 等待的行在blcok中的位置

  

4. oracle中锁的检测及解锁

--查看被锁的表
SELECT
p.spid, a.serial#, c.object_name, b.session_id, b.oracle_username,b.os_user_name
FROM
v$process p, v$session a, v$locked_object b, all_objects c
WHERE
p.addr = a.paddr
AND
a.process = b.process
AND
c.object_id = b.object_id; --查看锁表的进程
select
b.sid,b.serial#
from
v$locked_object a,v$session b
where
a.session_id = b.sid
group by
b.sid,b.serial#; --单个删除锁表的进程
alter system kill session '36,32435' --批量删除锁表的进程
declare cursor
mycur
is
select
b.sid,b.serial#
from
v$locked_object a,v$session b
where
a.session_id = b.sid
group by
b.sid,b.serial#;
begin
for cur in mycur
loop
execute immediate ( 'alter system kill session '''||cur.sid || ','|| cur.SERIAL# ||''' ');
end loop;
end;

  

  

ORACLE【2】:锁机制及解锁的更多相关文章

  1. Oracle的锁表与解锁

    Oracle的锁表与解锁 SELECT /*+ rule */ s.username, decode(l.type,'TM','TABLE LOCK', 'TX','ROW LOCK', NULL) ...

  2. Oracle系列-锁表与解锁解决方案(大招版)-解决问题才是王道

    [Oracle系列-锁表与解锁解决方案(大招版)] --1查看被锁的表 select b.owner,b.object_name,a.session_id,a.locked_mode from v$l ...

  3. Oralce进程信息查看,Oracle的锁表与解锁

    参考: oracle查看锁表进程,杀掉锁表进程 Oracle的锁表与解锁 查看锁表进程SQL语句: select * from v$session t1, v$locked_object t2 whe ...

  4. Oracle系列-锁表与解锁解决方案(基础版)

    [Oracle锁表查询和解锁解决方案] 一.了解原因(借鉴整理) 数据库操作语句的分类 DDL:数据库模式定义语言,关键字:createDML:数据操纵语言,关键字:Insert.delete.upd ...

  5. oracle 事务 锁机制

    原文地址:http://www.cnblogs.com/quanweiru/archive/2013/05/24/3097367.html 本课内容属于Oracle高级课程范畴,内容略微偏向理论性,但 ...

  6. ORACLE的锁机制

    数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性. 加锁是实现数据 ...

  7. Oracle数据库锁表及解锁进程

    下午代码迁移,更新数据库记录时for update语句无法执行,数据库被锁,KILL掉几个进程搞定. Oracle数据库操作中,我们有时会用到锁表查询以及解锁和kill进程等操作,那么这些操作是怎么实 ...

  8. Oracle查询锁表和解锁

    1.查询是否锁表 SELECT l.session_id sid, s.serial#, l.locked_mode,l.oracle_username, l.os_user_name,s.machi ...

  9. oracle 查看锁表及解锁的语句

    解锁语句: alter system kill session 'sid, serial#'; alter system kill session '23, 1647'; 查询那些对象被锁: sele ...

随机推荐

  1. Spark Streaming揭秘 Day23 启动关闭源码图解

    Spark Streaming揭秘 Day23 启动关闭源码图解 今天主要分析一下SparkStreaming的启动和关闭过程. 从Demo程序出发,主要聚焦在两段代码: 启动代码: 关闭代码: 启动 ...

  2. 自学JAVA总结

    2.在定义常量的时候C语言中定义为const而JAVA中为final3.在JAVA声明成员变量的时候,使用static来定义.4.在JAVA中的boolean类型只包括true和false,但是在C中 ...

  3. MVC学习系列——参考

    C#进阶系列——WebApi接口传参不再困惑:传参详解 http://www.cnblogs.com/landeanfen/p/5337072.html

  4. 走进Vue.js

    走进Vue.js Vue.js作为目前最热门最具前景的前端框架之一,其提供了一种帮助我们快速构建并开发前端项目的新的思维模式.本文旨在帮助大家认识Vue.js,了解Vue.js的开发流程,并进一步理解 ...

  5. C# Windows - TextBox 控件

    .NET Framework内置了两个基本控件来提取用户输入的文本: TextBox和RichTextBox.这两个控件都派生于基类TextBoxBase,而TextBoxBase派生于Control ...

  6. 1021: [SHOI2008]Debt 循环的债务 - BZOJ

    Description Alice.Bob和Cynthia总是为他们之间混乱的债务而烦恼,终于有一天,他们决定坐下来一起解决这个问题.不过,鉴别钞票的真伪是一件很麻烦的事情,于是他们决定要在清还债务的 ...

  7. js数组反转

    var _li = test.getElementsByTagName("li"), arrayObj = [].slice.apply(_li),//_li用apply调用sli ...

  8. jQuery列表拖动排列-jquery list dragsort插件参数和使用方法

    在编写网页的时候,有时可能需要对ul的li进行排序,今天就给大家推荐使用jquery插件jquery list dragsort实现列表拖动排序效果. 效果如图: jquery list dragso ...

  9. Hibernate注解方法使用总结

    1.类级别注解 @Entity     映射实体类 @Table    映射数句库表 @Entity(name="tableName") - 必须,注解将一个类声明为一个实体bea ...

  10. XoftSpy 4.13的注册算法分析

    [标题]XoftSpy 4.13的注册算法分析 [作者]forever[RCT] [语言]VC [工具]ida4.6,ollydbg1.1 [正文]       这个软件的算法很简单,正好拿来做逆向分 ...