oracle多粒度封锁机制研究(论坛)

合集下载

oracle锁表问题处理

oracle锁表问题处理

oracle锁表问题处理查询表的状况的对象:V$LOCK, V$LOCKED_OBJECT, V$SESSION, V$SQLAREA, V$PROCESS select * from v$locked_objectselect * from dba_objects方法:首先查看哪些表被锁住了select b.owner,b.object_name,a.session_id,a.locked_modefrom v$locked_object a,dba_objects bwhere b.object_id = a.object_id;select ername,b.sid,b.serial#,logon_timefrom v$locked_object a,v$session bwhere a.session_id = b.sid order by b.logon_time;杀进程中的会话alter system kill session 'sid,serial#';例如:alter system kill session '29,5497';查询锁表的方法:SELECT S.SID SESSION_ID, ERNAME, s.SERIAL#,DECODE(LMODE, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive',TO_CHAR(LMODE)) MODE_HELD, DECODE(REQUEST, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive',TO_CHAR(REQUEST)) MODE_REQUESTED, O.OWNER||'.'||O.OBJECT_NAME||' ('||O.OBJECT_TYPE||')',S.TYPE LOCK_TYPE, L.ID1 LOCK_ID1, L.ID2 LOCK_ID2FROM V$LOCK L, SYS.DBA_OBJECTS O, V$SESSION SWHERE L.SID = S.SID AND L.ID1 = O.OBJECT_ID ;解锁方法:ALTER SYSTEM KILL SESSION 'SID,SERIR#'0----------0--------SQL> alter system kill session '1679,2456';alter system kill session '1679,2456'*ERROR at line 1:ORA-01031: insufficient privilegesgrant execute on p_kill_user_session to rtgs_liush();操作的时候用命令:EXEC SYS.P_KILL_USER_SESSION(1679);------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------数据库锁表的分析与解决上面介绍了内存溢出的原因和处理方法,下面再介绍一下数据库锁表及阻塞的原因和处理办法。

Oracle封锁及动态游标准技术分析与应用

Oracle封锁及动态游标准技术分析与应用
锁 总 C c eMa ae e t o ah n g m n) D ML锁又 分为 T X锁 (rn at nL c 事 务锁或 Ta sci ok. o 第

式游标不需 明确建立游标变量 ,在 P / L中使用 LQ S
D ML语句 时 ,在每 一条 D ML语 句后都 可使 用 O A R— C 提供 的名 为 S L的 隐示游 标 ;而显 式 游标则 需 E L Q 要声 明游标 变量并按 照一 定的步 骤进 行使 用 , 动态游
访 问某些 数 据锁数 据, 就会 用 到手 工封 锁 。手 工封 锁 可以通 过 S L Q 语句 实现, 如前 面提 到 的 S L C O P A E语 例 E E TF RU D T 句 就 是 手 工 封 锁 的 主 要 方法 ,也 可 以通 过 D MS B _ LC O K包 实现 或 使用 L C A L O K T B E命 令来 进 行封 锁,
行级锁) T 和 M锁 (a l Ma iuai , T be np lt n表级锁) o 。当修改 表 数据或使 用 S L C O P A E时, 修改 或将 E E TF RU D T 被 被 修改 的每一 行获得 一个 T X锁 , 如果 一个 事 务更新

_ -

维普资讯
实践 s 经 验
李振 宏
( 南京 信息工 程大学 计算 机与 软件学 院 , 京 2 0 4 ) 南 104
摘 要 :对 Orc al 封 锁 机 制 和 动 态 游 标 技 术 进 行 了介 绍 , e的 以及 Orc al e的封 锁 类 型 和 Orc al 态 游 标 e动


uai ag a e lt n Ln u g )锁 、 D ( aaD f io a ga e o D L D t e nt n L n ug ) i i

oracle锁原理

oracle锁原理

Oracle锁原理详解1. 概述在Oracle数据库中,锁是用于控制并发访问的一种机制。

当多个用户同时访问数据库时,为了保证数据的一致性和完整性,Oracle会对数据进行加锁,以防止其他用户对数据的修改。

本文将详细介绍Oracle锁的基本原理。

2. 锁的类型Oracle中的锁可以分为两种类型:共享锁(Shared Lock)和排他锁(Exclusive Lock)。

•共享锁:多个事务可以同时获取共享锁,并且可以并发读取数据,但不能修改数据。

共享锁用于保证数据的一致性,即多个事务可以同时读取相同的数据,但不能同时修改数据。

•排他锁:只有一个事务可以获取排他锁,并且其他事务不能同时获取共享锁或排他锁。

排他锁用于保证数据的完整性,即一个事务在修改数据时,其他事务不能同时读取或修改数据。

3. 锁的级别Oracle中的锁可以分为多个级别,包括表级锁、行级锁和字段级锁。

•表级锁:锁定整个表,阻止其他事务对表的修改。

表级锁对于大型表来说,可能会导致性能问题,因为它会阻塞其他事务的访问。

•行级锁:锁定表中的一行数据,其他事务可以并发读取其他行的数据。

行级锁可以更细粒度地控制并发访问,但可能会导致死锁问题。

•字段级锁:锁定表中的一个或多个字段,其他事务可以并发读取或修改其他字段的数据。

字段级锁可以进一步细化锁的粒度,但也可能导致死锁问题。

4. 锁的控制Oracle中的锁由数据库管理系统(DBMS)自动控制,用户无需手动操作。

当一个事务对数据进行修改时,DBMS会自动为该数据加上相应的锁,并在事务提交或回滚后释放锁。

锁的控制是通过锁定机制和并发控制机制实现的。

•锁定机制:当一个事务对数据进行修改时,DBMS会自动为该数据加上相应的锁。

锁定机制可以保证在并发访问时,每个事务都能正确地读取和修改数据。

•并发控制机制:当多个事务同时访问数据库时,DBMS会根据事务的隔离级别来控制并发访问。

并发控制机制可以避免脏读、不可重复读和幻读等问题。

Oracle数据库死锁问题研究_姜文

Oracle数据库死锁问题研究_姜文

收稿日期:2013-05-19修回日期:2013-08-27网络出版时间:2014-01-08基金项目:国家部委基础科研计划:国防预算基金项目(D1120060967)作者简介:姜文(1986-),女,陕西西安人,硕士研究生,CCF 会员,研究方向为图像处理与分析、文字信息分析处理;刘立康,副教授,研究方向为数字通信、图像传输与处理、图像分析与图像识别等。

网络出版地址:http ://www.cnki.net /kcms /detail /61.1450.TP.20140108.0818.018.htmlOracle 数据库死锁问题研究姜文1,刘立康2(1.文思海辉技术有限公司西安分公司,陕西西安710075;2.西安电子科技大学通信工程学院,陕西西安710071)摘要:数据库是网络环境下多用户使用的共享资源,数据库在处理多线程大量数据存取过程中很可能出现死锁现象。

文中介绍了Oracle 数据库锁机制和死锁发生的原因,Oracle 数据库检测死锁采用的相关视图。

详细叙述了SQL 语句检测死锁、死锁的定位方法和解决数据库死锁的方法。

编写了在Linux 环境中死锁检测脚本,模拟Oracle 数据库死锁测试了脚本的正确性。

实际应用表明该方法可以有效监测程序中的主要模块是否发生死锁,而且简单有效。

关键词:Oracle 数据库;数据库锁;死锁中图分类号:TP311文献标识码:A文章编号:1673-629X (2014)03-0097-05doi :10.3969/j.issn.1673-629X.2014.03.035Research on Deadlock of Oracle DatabaseJIANG Wen 1,LIU Li -kang 2(1.The Pactera Technology Co.,Ltd.Xi ’an Branch ,Xi ’an 710075,China ;2.School of Telecommunication Engineering ,Xidian University ,Xi ’an 710071,China )Abstract :The database is a shared resource of multi -user in network environment ,database deadlock phenomenon is likely to occur in multi -threaded process by large amounts of data access.Introduce the Oracle database locking mechanism and the causes the deadlock occurs ,the Oracle database detects the related views deadlock uses.A detailed description is conducted for the SQL states the deadlock de-tection ,the positioning method of deadlock and the resolution of the database deadlock.Compiled the deadlock detection script in the Linux environment ,simulate the Oracle database deadlock to test the correctness of the script.Practical application shows that the script can be effective monitoring whether the program ’s main module is deadlock or not ,with simplicity and effectiveness.Key words :Oracle database ;database locks ;deadlock0引言大型数据库应用系统的并发量是很大的,可能有数十万甚至数百万用户同时访问数据库。

oracle多粒度封锁机制研究

oracle多粒度封锁机制研究

Oracle多粒度封锁机制研究1引言—数据库锁的基本概念为了确保并发用户在存取同一数据库对象时的正确性(即无丢失修改、可重复读、不读“脏”数据),数据库中引入了锁机制。

基本的锁类型有两种:排它锁(Exclusive locks记为X锁)和共享锁(Share locks记为S锁)。

排它锁:若事务T对数据D加X锁,则其它任何事务都不能再对D加任何类型的锁,直至T释放D上的X锁;一般要求在修改数据前要向该数据加排它锁,所以排它锁又称为写锁。

共享锁:若事务T对数据D加S锁,则其它事务只能对D加S锁,而不能加X锁,直至T释放D上的S锁;一般要求在读取数据前要向该数据加共享锁,所以共享锁又称为读锁。

2Oracle 多粒度封锁机制介绍根据保护对象的不同,Oracle数据库锁可以分为以下几大类:(1)DML lock(data locks,数据锁):用于保护数据的完整性;(2)DDL lock(dictionary locks,字典锁):用于保护数据库对象的结构(例如表、视图、索引的结构定义);(3)internal locks 和l a t c h es(内部锁与闩):保护内部数据库结构;(4)distributed locks(分布式锁):用于OPS(并行服务器)中;(5)PCM locks(并行高速缓存管理锁):用于OPS(并行服务器)中。

本文主要讨论DML(也可称为data locks,数据锁)锁。

从封锁粒度(封锁对象的大小)的角度看,Oracle DML锁共有两个层次,即行级锁和表级锁。

2.1 Oracle的TX锁(行级锁、事务锁)许多对Oracle不太了解的技术人员可能会以为每一个TX锁代表一条被封锁的数据行,其实不然。

TX的本义是Transaction(事务),当一个事务第一次执行数据更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE语句进行查询时,它即获得一个TX(事务)锁,直至该事务结束(执行COMMIT或ROLLBACK操作)时,该锁才被释放。

Oracle包被锁定的原因分析及解决方案

Oracle包被锁定的原因分析及解决方案

Oracle包被锁定的原因分析及解决方案在数据库的开发过程中,经常碰到包、存储过程、函数无法编译或编译时会导致PL/SQL 无法响应的问题。

碰到这种问题,基本上都要重启数据库解决,严重浪费开发时间。

本文将就产生这种现象的原因和解决方案做基本的介绍。

问题分析从事数据库开发的都知道锁的概念,如:执行Update Table xxx Where xxx 的时候就会产生锁。

这种常见的锁在Oracle 里面被称为DML锁。

在Oracle中还有一种DDL锁,主要用来保证存储过程、表结构、视图、包等数据库对象的完整性,这种锁的信息可以在DBA_DDL_LOCKS中查到。

注意:V$LOCKED_OBJECT记录的是DML锁信息,DDL锁的信息不在里面。

对应DDL锁的是DDL语句,DDL语句全称数据定义语句(Data Define Language)。

用于定义数据的结构或Schema,如:CREATE、ALTER、DROP、TRUNCATE、COMMENT、RENAME。

当我们在执行某个存储过程、或者编译它的时候Oracle会自动给这个对象加上DDL锁,同时也会对这个存储过程所引用的对象加锁。

了解了以上知识以后,我们可以得出结论:编译包长时间无响应说明产生了死锁。

我们可以轻易的让这种死锁发生,举例:1、打开一个PL/SQL,开始调试某个函数(假设为:FUN_CORE_SERVICECALL),并保持在调试状态2、打开一个SQL Window,输入Select *Fromdba_ddl_locks aWhere ='FUN_CORE_SERVICECALL'会发现一行记录:3、打开一个新的PL/SQL,重新编译这个函数。

我们会发现此时已经无法响应了4、回到第一个PL/SQL ,重新执行Select *Fromdba_ddl_locks aWhere ='FUN_CORE_SERVICECALL'我们将会看到如下记录:5、上述的情况表明发生了锁等待的情况。

Oracle常见死锁发生的原因以及解决方法

Oracle常见死锁发生的原因以及解决方法

Oracle常见死锁发生的原因以及解决方法死锁是指在并发程序中,两个或多个进程因为争夺系统资源而陷入无限等待的状态,从而无法继续执行下去。

在Oracle数据库中,死锁是一个非常常见的问题,它会导致系统性能下降,甚至造成系统崩溃。

本文将详细介绍Oracle常见死锁发生的原因以及解决方法。

一、死锁发生的原因1.竞争资源:当多个进程同时请求相同的资源时,可能会导致死锁的发生。

例如,如果两个进程同时请求一个表的写锁,那么它们就会陷入死锁状态。

2.锁的顺序:当多个进程按照不同的顺序请求锁时,可能会导致死锁的发生。

例如,如果进程A先请求资源X,再请求资源Y,而进程B先请求资源Y,再请求资源X,那么它们就会陷入死锁状态。

3.锁的持有时间:当一个进程持有一个锁,并且在等待其他资源时继续保持该锁,可能会导致死锁的发生。

例如,如果进程A持有资源X的锁,并且在等待资源Y时继续保持该锁,而进程B持有资源Y的锁,并且在等待资源X时继续保持该锁,那么它们就会陷入死锁状态。

二、死锁的解决方法1. 死锁检测和解除:Oracle数据库提供了死锁检测和解除的机制。

当一个进程请求一个资源时,数据库会检查是否存在死锁。

如果存在死锁,数据库会选择一个进程进行回滚,解除死锁状态,并且通知其他进程重新尝试获取资源。

2.超时设置:为了避免死锁的发生,可以设置超时时间。

当一个进程请求一个资源时,如果在指定的超时时间内无法获取资源,那么就放弃该请求,并且释放已经持有的资源。

这样可以防止死锁的发生,但是会增加系统的开销。

3.锁的顺序:为了避免死锁的发生,可以规定所有进程按照相同的顺序请求锁。

例如,可以规定所有进程按照资源的名称进行排序,然后按照顺序请求锁。

这样可以避免死锁的发生,但是可能会影响系统的性能。

4.锁的粒度:为了避免死锁的发生,可以尽量减小锁的粒度。

例如,可以将一个大的锁分解成多个小的锁,这样可以减少锁的冲突,降低死锁的概率。

但是需要注意的是,锁的粒度过小可能会导致系统的性能下降。

oracle锁与死锁概念,阻塞产生的原因以及解决方案

oracle锁与死锁概念,阻塞产生的原因以及解决方案

oracle锁与死锁概念,阻塞产⽣的原因以及解决⽅案锁是⼀种机制,⼀直存在;死锁是⼀种错误,尽量避免。

⾸先,要理解锁和死锁的概念:1、锁:定义:简单的说,锁是数据库为了保证数据的⼀致性⽽存在的⼀种机制,其他数据库⼀样有,只不过实现机制上可能⼤相径庭。

那么,锁的种类有哪些?锁的种类有很多,根据保护的对象不同,Oracle数据库锁可以分为以下⼏⼤类:DML锁(data locks,数据锁),⽤于保护数据的完整性;DDL锁(dictionary locks,字典锁),⽤于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护数据库的内部结构。

在实际项⽬中遇到的最多的是DML锁,也可进⼀步说是⾏级锁。

这些⾏级锁在程序并发访问的时候会造成程序很慢,或者直接访问不了的情况—这种现象称为阻塞。

那么,产⽣阻塞的原因是什么呢?定义:当⼀个会话保持另⼀个会话正在请求的资源锁定时,就会发⽣阻塞。

被阻塞的会话将⼀直挂起,直到持有锁的会话放弃锁定的资源为⽌。

四个常见的DML语句会产⽣阻塞:1)INSERT 2)U PDATE 3)DELETE 4)SELECT…FOR UPDATE2、死锁:定义:当两个⽤户同时希望持有对⽅的资源时就会发⽣死锁。

即当两个⽤户互相等待对⽅释放资源时,oracle认定产⽣了死锁,在这种情况下,将以牺牲⼀个⽤户为代价,另⼀个⽤户继续执⾏,牺牲的事物将回滚。

例⼦: 1:⽤户1对A表进⾏Update,没有提交。

2:⽤户2对B表进⾏Update,没有提交。

此时双反不存在资源共享的问题。

3:如果⽤户2此时对A表作update,则会发⽣阻塞,需要等到⽤户⼀的事物结束。

4:如果此时⽤户1⼜对B表作update,则产⽣死锁。

此时Oracle会选择其中⼀个⽤户进⾏会滚,使另⼀个⽤户继续执⾏操作。

起因: Oracle的死锁问题实际上很少见,如果发⽣,基本上都是不正确的程序设计造成的,经过调整后,基本上都会避免死锁的发⽣。

一文搞懂Oracle0至6级锁(附案例详解)

一文搞懂Oracle0至6级锁(附案例详解)

一文搞懂Oracle0至6级锁(附案例详解)11g Concepts中摘录的锁的信息Table Locks (TM)A table lock, also called a TM lock, is acquired by a transaction when a table is modified by an INSERT, UPDATE, DELETE, MERGE, SELECT with the FOR UPDATE clause, or LOCK TABLE statement. DML operations require table locks to reserve DML access to the table on behalf of a transaction and to prevent DDL operations that would conflict with the transaction.当事务通过INSERT、UPDATE、DELETE、MERGE和FOR UPDATE对表进行修改时,就会获得一个表锁,也称为TM锁子句,或锁表语句。

DML操作需要表锁来为事务保留对表的DML访问权限,并防止DDL与事务冲突的操作。

A table lock can be held in any of the following modes:Row Share (RS)This lock, also called a subshare table lock (SS), indicates that the transaction holding the lock on the table has locked rows in the table and intends to update them. A row share lock is the least restrictive mode of table lock, offering the highest degree of concurrency for a table.这个锁,也称为子共享表锁(SS),表示持有表上锁的事务已锁定表中的行并打算锁定更新它们。

oracle数据库锁使用

oracle数据库锁使用

Oracle的锁机制归纳总结2010-06-09 作者:wallimn 来源:wallimn的blog锁是防止在两个事务操作同一个数据源(表或行)时交互破坏数据的一种机制。

Oracle采用封锁技术保证并发操作的可串行性。

Oracle的锁分为两大类:数据锁(也称DML锁)和字典锁。

字典锁是Oracle DBMS内部用于对字典表的封锁。

字典锁包括语法分析锁和DDL锁,由DBMS在必要的时候自动加锁和释放锁,用户无机控制。

Oracle主要提供了5种数据锁:共享锁(Share Table Lock,简称S锁)、排它锁(Exclusive Table Lock,简称X锁)、行级锁(Row Share Table Lock,简称RS锁)、行级排它锁(Row Exclusive Table Lock,简称RX 锁)和共享行级排它锁(Share Row Exclusive Table Lock,简称SRX锁)。

其封锁粒度包括行级和表级。

1. 共享锁(Share Table Lock,S):加锁语法:Lock Table TableName In Share Mode;允许的操作:一个共享锁由一个事务控制,仅允许其它事务查询被锁定的表。

一个有效的共享锁明确地用Select … For update形式锁定行,或执行Lock Table TableName In Share Mode语法锁定整个表,不允许被其它事务更新。

允许多个事务在同一个表上加共享锁,这种情况下不允许在该表上加锁的事务更新表(即使有一个事务控制的是形如Select Row … for update这样行锁也是不被允许的)。

因此,仅有一个事务的一个共享锁可以更新该表如果其它事务也有相同的事务在该表上的话。

禁止的操作:一个共享锁由一个事务来控制,防止其它事务更新该表或执行下面的语句:LOCK TABLE TableName IN SHARE ROW EXCLUSIVE MODE;LOCK TABLE TableName IN ROW EXCLUSIVE MODE;2. 排它锁(Exclusive Table Lock,X):排它锁是在锁机制中限制最多的一种锁类型,允许加排它锁的事务独自控制对表的写权限。

Oracle锁机制内部原理解惑

Oracle锁机制内部原理解惑

Oracle锁机制内部解惑Oracle锁机制内部原理解惑从宏观上来讲Oracle的锁机制的帖子已经比较多了,此处,不做宏观上说明,只对Oracle锁机制内幕做一定说明。

Oracle的锁分为5大类:1、DML锁。

2、DDL锁。

3、Latch&mutex&internal lock。

4、分布式锁(Distributed locks)。

5、PCM锁。

本文只讨论前三种锁。

关于DML锁:在Tom的《Export Oracle Database Archicture 9i&10g&11g》将Oracle的DML锁分为两类,包括:TM锁、TX锁。

而在《Dsi405》中,又将Oracle的DML锁分为Row locks、Table Locks。

TM locks=Row locks+Table locks也就是说,在《Dsi405》中,TX锁(事务锁)从DML锁中剔除(或者是因为出于某种原因,觉得没有必要包括进来)了!实际上,row locks和TX锁在内部实现上,联系是非常紧密的,所以,大胆猜测,Dsi的编写者Christine Jeal、Jim Womack可能觉得没有必要把TX锁单独罗列出来。

关于DDL锁:DDL主要分为两大类:1、Row Cache locks(我觉得称为“dictionary cache locks”更恰当一些)。

2、Library Cache locks(Breakable parse locks)。

3、Library Cache pins。

关于Oracle锁定义上的歧义:在Tom的《Export Oracle Database Archicture 9i&10g&11g》中,DML是,Data Manipulation Language的意思。

在《Dsi405》中,DML是Data Manipulation Locks的意思。

在Tom的《Export Oracle Database Archicture 9i&10g&11g》,DDL是Data Definition Language。

oracle的TM锁TX锁知识完全普及

oracle的TM锁TX锁知识完全普及

o r a c l e的T M锁T X锁知识完全普及Revised final draft November 26, 2020o r a c l e的T M锁、T X锁知识完全普及锁概念基础数据库是一个多用户使用的共享资源。

当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存数据,破坏数据库的一致性。

加锁是实现数据库并发控制的一个非常重要的技术。

当事务在对某个数据对象进行操作前,先向系统发出请放锁之前,其他的事务不能对此数据对象进行更新操作。

在数据库中有两种基本的锁类型:排它锁(ExclusiveLocks,即X锁)和共享锁(ShareLocks,即S锁)。

锁的数据对象可以被其他事务读取,但不能修改。

数据库利用这两种基本的锁类型来对数据库的事务进行并Oracle数据库的锁类型根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(datalocks,数据锁),用于保护数的结构,如表、索引等的结构定义;内部锁和闩(internallocksandlatches),保护数据库的内部结构。

DML锁的目的在于保证并发情况下的数据完整性,。

在Oracle数据库中,DML锁主要包括TM锁和TX锁,其当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。

当TM锁获得后,系统再自动申加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统表示。

不同的SQL操作产生不同类型的TM锁。

在数据行上只有X锁(排他锁)。

在Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个T 上执行DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。

当第一个会话提交后,TX当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,未响应,大量事务失败等。

悲观封锁和乐观封锁一、悲观封锁锁在用户修改之前就发挥作用:Select..forupdate(nowait)Select*fromtab1forupdate用止其他用户的修改。

Oracle死锁分析过程详解

Oracle死锁分析过程详解

Oracle死锁分析过程详解Oracle死锁分析过程详解Oracle死锁分析关于死锁一般3种处理方式1、事前预测2、资源分级3、事后检测释放我知道的ORACLEMYSQL都是采用第三种在行锁级别上的话。

这里分析一个ORACLE死锁,首先一个死锁肯定会生成一个TRACE文件,这里会记录很多信息如:Deadlockgraph:---------Blocker(s)-----------------Waiter(s)---------ResourceNameprocesssessionholdswaitsprocesssessionhold swaitsTX-0058000f-0000b4736491204X6511252XTX-0019001c-0004e0b06511252X6491204X这里给出了进程和会话idRowswaitedon:Session1204:obj-rowid=0003D942-AAA9lCAAEAADgaNAAI (dictionaryobjn-252226,file-4,block-919181,slot-8) Session1252:obj-rowid=0003D942-AAA9lCAAEAADgaNAAa (dictionaryobjn-252226,file-4,block-919181,slot-26)这里给出导致死锁的行同时给出了最后触发死锁会话1252的语句-----InformationfortheOTHERwaitingsessions----- Session1252:sid:1252ser:35883audsid:7170593user:235/FEECORESV flags:(0x100045)USR/-flags_idl:(0x1)BSY/-/-/-/-/-flags2:(0x40009)-/-/INCpid:651O/Sinfo:user:oracle,term:UNKNOWN,ospid:13035 image:oracle@oratest11clientdetails:O/Sinfo:user:sky,term:unknown,ospid:1234machine:autobotsprogram:JDBCThinClientapplicationname:JDBCThinClient,hashvalue=2546894660currentSQL:UPDATE-----EndofinformationfortheOTHERwaitingsessions-----InformationforTHISsession:-----CurrentSQLStatementforthissession(sql_id=3vh5sc7pgtrjy)-----UPDATE那么到这里我们大概能够分析出A:1204拿到AAA9lCAAEAADgaNAAa行锁B:1252拿到AAA9lCAAEAADgaNAAI行锁C:1204需要AAA9lCAAEAADgaNAAI则等待D:1252需要AAA9lCAAEAADgaNAAa则触发死锁1204回滚那么随后trace给出1204C这一步等待时间和事物信息SO:0xee1fcd10,type:4,owner:0xf031e750,flag:INIT/-/-/0x00if:0x3c:0x3proc=0xf031e750,name=session,file=ksu.hLINE:12624,pg=0(session)sid:1204ser:2443trans:0xe9221180,creator:0xf031e 750flags:(0x100045)USR/-flags_idl:()BSY/-/-/-/-/-flags2:(0x40009)-/-/INCDID:,short-termDID:txnbranch:(nil)oct:6,prv:0,sql:0xf25d2278,psql:0xc4346788,user:235/FEECO RESVksuxdsFALSEatlocation:0servicename:SYS$USERSCurrentWaitStack:0:waitingfor''enq:TX-rowlockcontention''name|mode=0x54580006,usn<<16|slot=0x19001c,sequence=0x4e0b0wait_id=33seq_num=34snap_id=1waittimes:snap=3.001739sec,exc=3.001739sec,total=3.0017 39secwaittimes:max=infinite,heur=3.001739secwaitcounts:calls=1os=1in_wait=1iflags=0x15a0随后给出了导致他等待会话的等待信息,这里不给出。

数据库并发控制中的锁粒度与锁策略分析

数据库并发控制中的锁粒度与锁策略分析

数据库并发控制中的锁粒度与锁策略分析互联网的发展以及大数据的普及使得数据库系统在如今的社会中扮演着重要的角色。

然而,当多个用户同时对数据库进行读写操作时,可能会引发数据不一致的问题。

为了解决这个问题,数据库并发控制使用了锁粒度和锁策略来协调多个用户之间的操作。

本文将对数据库并发控制中的锁粒度与锁策略进行深入分析。

一、锁粒度锁粒度是指对数据库中的数据对象进行加锁的程度,它直接影响到数据库并发控制的效率和性能。

常见的锁粒度包括表级锁、页级锁、行级锁等。

1. 表级锁:表级锁是对整个表进行加锁,当一个用户对表进行读写操作时,其他用户对该表的读写操作都会被阻塞。

表级锁具有简单、粗粒度的特点,因此在并发量较小的情况下,效果较好。

不过,当并发量增大时,表级锁的性能会显著下降,因为它会导致较高的阻塞和资源争用。

2. 页级锁:页级锁是对数据页进行加锁,数据页是数据库存储数据的最小单位。

相比表级锁,页级锁的并发性能有所提升,因为不同用户可以同时读取同一个表中不同的数据页。

但是,由于数据页的数量很大,页级锁仍可能引发较高的锁冲突和阻塞。

3. 行级锁:行级锁是对数据库表中的每一行数据进行加锁,它是最细粒度的锁。

行级锁在并发控制的粒度上比表级锁和页级锁更加细致,可以有效减少锁的冲突和资源争用,提高系统的并发性能。

但是,行级锁需要更多的存储空间来维护锁信息,并且添加、释放锁的开销也比较大。

因此,在高并发的情况下,行级锁可能会导致锁的开销过大而影响系统的性能。

二、锁策略在数据库并发控制中,不同的锁策略可以进一步优化系统的并发性能和数据一致性。

常见的锁策略包括悲观锁和乐观锁。

1. 悲观锁:悲观锁是一种保守的锁策略,在整个操作过程中假设会发生并发冲突。

因此,在悲观锁策略下,数据库会对需要进行读写操作的数据对象进行加锁,阻止其他用户访问。

悲观锁适用于对数据一致性要求较高的情况,但它会导致较高的锁冲突和阻塞,降低系统的并发性能。

2. 乐观锁:乐观锁是一种较为开放的锁策略,在整个操作过程中假设不会发生并发冲突。

数据库粒度锁与行级锁的比较与选择

数据库粒度锁与行级锁的比较与选择

数据库粒度锁与行级锁的比较与选择数据库中的锁是保证数据并发操作时的一种重要机制,用于提供数据的一致性和事务的隔离。

在数据库中,常用的锁机制包括粒度锁与行级锁。

本文将对数据库粒度锁与行级锁进行比较与选择。

1. 粒度锁粒度锁是指在数据库中锁定更大范围的数据,如表级或页级锁。

它的优点是减少了锁的竞争,提高了数据库并发处理能力。

同时,粒度锁是隐式获取和释放的,减少了锁管理的开销。

但是,粒度锁不能提供最大的并发性,因为多个事务可能会被阻塞,等待锁定整个数据对象。

此外,粒度锁对于数据修改操作不够细粒度,可能导致无关数据的锁定。

2. 行级锁相比之下,行级锁是在数据库中锁定更小范围的数据,如单个数据行。

行级锁具有更高的并发性,因为它只锁定所需修改的数据行,减少了事务之间的互相影响。

行级锁的另一个优点是可以进行更细粒度的控制,允许并发执行多个事务。

然而,行级锁也存在着一些性能开销,因为它需要较多的锁管理操作。

3. 比较与选择在实际应用中,选择粒度锁与行级锁需要根据具体的场景和需求来决定。

当数据的并发读取较多,且多个事务对同一数据进行读取操作时,粗粒度锁是一个不错的选择。

它可以提供较好的并发处理能力,并避免不必要的锁定操作。

同时,粗粒度锁也适用于对整个表或页进行修改操作的情况。

然而,当并发写入和更新较多,且多个事务对同一数据进行修改操作时,行级锁则更加合适。

它可以避免多个事务之间的冲突,保证数据的一致性和事务的隔离性。

同时,行级锁也可以通过使用索引提高查询性能,只锁定相关的数据行。

除了以上的选择要基于具体场景,还可以根据数据库管理系统的支持情况来决定。

不同的数据库管理系统对锁机制的实现方式和性能有所不同。

因此,可以根据具体的数据库系统,选择支持较好的锁机制。

总之,数据库粒度锁与行级锁都有各自的优点和适用场景。

选择合适的锁机制需要综合考虑数据的读写操作和并发性要求。

合理使用锁机制可以提高数据库的性能和并发处理能力,同时确保数据的一致性与事务的隔离性。

oracle的锁与并发机制

oracle的锁与并发机制

oracle的锁与并发机制锁是并发访问的时候用于保护不共享资源不被同时并发修改的机制。

oracle锁分为DML锁,DDL锁,内部锁和latchDML锁确保一次只能只有一个人修改某一行(TX锁),而且正在处理一个表时别人不能删除(TM锁)。

DDL锁,在DDL操作是系统会自动为对象加上DDL锁,保护这些对象不被其他会话锁修改。

latch是轻量级的串行化设备,用于协调对共享数据结构、对象、文件的多用户访问,一般都是保护共享内存结构使用的锁,在此不做讨论。

一般的锁管理器工作过程:1.找到想要锁定的那一行地址2.在锁管理器排队3.锁定列表4.搜索列表,查看别人是否锁定这一行5.在列表中创建一个新的条目,表明已经锁定这一行6.对列表解锁接下里修改,之后提交修改后,继续过程:7.再次排队8.锁住锁的列表9.在这个列表中锁定,并释放所有的锁10.对列表解锁oracle锁管理方式:找到需要锁定的那行地址到达那一行锁定这一行通常lock有三个组件:Resource Structure(资源)、Lock Structure(锁)和Enqueue(排队机制)Resource和lock是数据结构,而Enqueue是算法。

Resource Structure每一个需要并发控制的资源都有用这个数据结构来描述,先关的成员为:owner、waiter和converter,这是三个指针,分别指向3个由Lock Structure组成的链表。

Lock Structure每当进程需要访问共享资源时,必须先“锁定”该资源,这个动作实际上是从内存中申请一个Lock Structure,,在其中记录“锁模式、进程ID”等重要信息。

然后看是否立即能够获得资源的访问权,如果不能的话将这个Lock structure挂到Resource Structure的Waiter链表中,如果能够获得,则把Lock Structure的owner链表中。

最常用的锁模式Share 拥有这对资源进行只读访问,允许其他用户并发只读访问Exclusive 拥有者对资源进行修改访问,不允许其他用户并发访问Enqueue 算法Lock使用的是Enqueue算法,可以理解为“先入先出队列”,如果进程的锁定请求不能满足,该进程的Lock Structure就被加到Waiter链表的末端。

深入浅出oracle锁

深入浅出oracle锁

深入浅出oracle锁---原理篇深入浅出oracle锁---锁阻塞的分析深入浅出oracle锁---原理篇在现代的多用户多任务系统中,必然会出现多个用户同时访问共享的某个对象,这个对象可能是表,行,或者内存结构,为了解决多个用户并发性访问带来的数据的安全性,完整性及一致性问题,必须要有一种机制,来使对这些共享资源的并发性访问串行化,oracle中的锁就可以提供这样的功能,当事务在对某个对象进行操作前,先向系统发出请求,对其加相应的锁,加锁后该事务就对该数据对象有了一定的控制权限,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作(可以做select动作,但select利用的是undo中的前镜像数据了).Oracle锁的分类Oracle锁基本上可以分为二类a:共享锁(sharelocks)也称读锁,s锁b:排它锁(exclusivelocks)也称写锁,x锁在数据库中有两种基本的锁类型:排它锁(ExclusiveLocks,即X锁)和共享锁(ShareLocks,即S锁)。

当数据对象被加上排它锁时,其他的事务不能对它读取和修改。

加了共享锁的数据对象可以被其他事务读取,但不能修改。

数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。

按锁保护的内容分类oracle提供多粒度封锁机制,按保护对象来分,据此又可以分为a:dml锁,data locks数据锁,用来保护数据的完整性和一致性b:ddl锁,dictionarylocks字典锁,用来保护数据对象的结构,如table,index的定义c:内部锁和闩internallocksandlatchs用来保护数据库内部结构,如sga内存结构dml锁DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TM锁的种类有S,X,SR,SX,SRX五种,TX锁称为事务锁或行级锁。

当Oracle执行delete,update,insert,selectforupdateDML语句时,oracle首先自动在所要操作的表上申请TM类型的锁。

Oracle中锁的产生和解锁

Oracle中锁的产生和解锁

Oracle中锁的产品和解锁文档修改记录1Oracle锁的介绍在多进程或者多线程业务系统中,多个Oracle用户可以同时登录到一个Oracle数据库,对数据库中的数据进行操作难免会出现同时访问同一数据(表或者表中某一条记录)的情况,如果不对这种情况进行规范操作,数据的一致性和完整性就得不到保证,从而会出现意想不到的结果,所以必须有一种机制对并发访问进行控制和调度,避免造成数据更新不正确。

Oracle锁就是这样一种机制,它是控制并发操作最常用的方法。

Oracle使用锁来防止进程相互之间发生的破坏性影响,当一个进程企图阻止另外一个进程对某条数据操作时,该进程就对这个数据进行锁,别的进程对这个数据操作之前,必须获得这个数据的解锁。

Oracle锁功能是Oracle DBMS自动完成的,不需要用户干预,但Oracle也提供了加锁的命令,供用户使用。

1.1 Oracle锁机制Oracle自动使用不同锁类型来控制数据的并发操作,以防止用户之间的破坏性干扰。

Oracle为一个事务自动锁一个资源,以防止其他事务对同一个资源的排他锁。

当某种条件出现或者事务不再需要该资源时,锁自动解除。

Oracle自动获取不同类型的锁取决于锁的资源及其所执行的操作。

其中包括数据锁(DML)、字典锁(DDL)、内部锁、人工锁定、分布锁和并行缓冲管理锁。

1.1.1数据锁(DML)模式数据锁保证表中数据在多个用户并发操作数据时保证数据的完整性,并防止相冲突的DML和DDL操作的破坏性干扰。

DML操作可在两个级别获取数据锁:行级锁(TX)和表级锁(TM)。

表级锁有以下几种方式●空Null,即无锁。

●行共享表锁(RS)行共享表锁(有时也叫SS),表明事务保持已锁表行的表锁,并试图修改数据。

这种锁是在执行以下命令的时自动获取:Select …From 表名… for update for …;Lock Table 表名 in Row Share Mode;当一个事务在一个表持有行共享锁的时候,允许其他事务并行查询、插入、修改或者删除及再进行行锁,但禁止其他事务以排他方式进行操作该表。

oracle数据库闩锁锁定与并发专题

oracle数据库闩锁锁定与并发专题

Oracle并发和latch专题Oracle本身是一个多用户并发处理系统,在同一个时间点上,可能会有多个用户同时操作数据库,这就涉及两个重要的问题1、这些用户之间的操作不会互相破坏,比如两个用户同时在相同的物理位置上写数据时,不能发生互相覆盖的情况,这叫做串行化,也就是说,即便两个用户同时在写,也必须有先后,一个用户写完,另一个用户继续写,串行化会降低系统的并发性,但这对保护数据结构不被破坏来说则是必须的2、在满足串行化的前提下,如何将并发性提升到最大Oracle中通过使用闩锁(latch)和锁定(lock)Latch和lock都是实现串行化的方法latch是一个低级别的,轻量级的锁,获得和释放的速度都很快lock可能持续很长时间,通过使用队列,先进先出的方式实现锁的白话意义:一种资源,如果可能发生多个进程同时访问的情况,造成资源的破坏,那么就需要给这种资源上一个锁,如果这种资源很简单,例如就是内存的分配和释放,那么就使用latch,如果这种资源相对复杂,有一定的逻辑判断,那么就需要使用lock资源的意义很广泛,因为进程总是通过内存来做修改、读取,因此资源都分布在内存中。

闩锁的概述(latch)Oracle使用闩锁来实现内存的分配和释放例如某个用户进程A发出一条update语句,要去更新58号数据块里的某条记录,则该用户进程对应的服务器进程在写内存的时候,找到58号数据块,并往里写内容,A在写58号数据块的过程中,这时另外一个用户进程B发出insert语句,要将某个新的记录插入到58号数据块中,如果没有一定的保护机制,A正要写入的空间可能被B抢先写入,B要写入的空间可能被A抢先写入,不管哪个用户先抢先写入,造成的结果就是,58号数据块的数据都混乱了如果使用latch来进行保护,简单的描述,任何进程要写数据块时,都必须先获得latch,在写入过程中,一直持有latch,写完以后,释放latch当A在写入58号数据块的时候,先获得latch,B也要写58号数据块,这时B尝试获得latch,发现该latch被A持有,B进入等待状态,直到A释放latch,B获得latch以后,才能在58号数据块中写入数据Latch用来锁住内存中的数据结构的,例如buffer,share pool,只要访问就有锁,因此latch 是快速的锁,latch锁的是资源不是数据块,latch保护的是资源的分配和释放不只是写数据块需要使用latch,shared pool中就没有数据块。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Oracle多粒度封锁机制研究1引言—数据库锁的基本概念为了确保并发用户在存取同一数据库对象时的正确性(即无丢失修改、可重复读、不读“脏”数据),数据库中引入了锁机制。

基本的锁类型有两种:排它锁(Exclusive locks记为X锁)和共享锁(Share locks记为S锁)。

排它锁:若事务T对数据D加X锁,则其它任何事务都不能再对D加任何类型的锁,直至T释放D上的X锁;一般要求在修改数据前要向该数据加排它锁,所以排它锁又称为写锁。

共享锁:若事务T对数据D加S锁,则其它事务只能对D加S锁,而不能加X锁,直至T释放D上的S锁;一般要求在读取数据前要向该数据加共享锁,所以共享锁又称为读锁。

2Oracle多粒度封锁机制介绍根据保护对象的不同,Oracle数据库锁可以分为以下几大类:(1)DML lock(data locks,数据锁):用于保护数据的完整性;(2)DDL lock(dictionary locks,字典锁):用于保护数据库对象的结构(例如表、视图、索引的结构定义);(3)internal locks和l a t c h es(内部锁与闩):保护内部数据库结构;(4)distributed locks(分布式锁):用于OPS(并行服务器)中;(5)PCM locks(并行高速缓存管理锁):用于OPS(并行服务器)中。

本文主要讨论DML(也可称为data locks,数据锁)锁。

从封锁粒度(封锁对象的大小)的角度看,Oracle DML锁共有两个层次,即行级锁和表级锁。

2.1Oracle的TX锁(行级锁、事务锁)许多对Oracle不太了解的技术人员可能会以为每一个TX锁代表一条被封锁的数据行,其实不然。

TX的本义是Transaction(事务),当一个事务第一次执行数据更改(Insert、Update、Delete)或使用SELECT…FOR UPDATE语句进行查询时,它即获得一个TX(事务)锁,直至该事务结束(执行COMMIT或ROLLBACK操作)时,该锁才被释放。

所以,一个TX 锁,可以对应多个被该事务锁定的数据行。

在Oracle的每行数据上,都有一个标志位来表示该行数据是否被锁定。

Oracle不象其它一些DBMS(数据库管理系统)那样,建立一个链表来维护每一行被加锁的数据,这样就大大减小了行级锁的维护开销,也在很大程度上避免了其它数据库系统使用行级封锁时经常发生的锁数量不够的情况。

数据行上的锁标志一旦被置位,就表明该行数据被加X锁,Oracle在数据行上没有S锁。

2.2TM锁(表级锁)2.2.1意向锁的引出表是由行组成的,当我们向某个表加锁时,一方面需要检查该锁的申请是否与原有的表级锁相容;另一方面,还要检查该锁是否与表中的每一行上的锁相容。

比如一个事务要在一个表上加S锁,如果表中的一行已被另外的事务加了X锁,那么该锁的申请也应被阻塞。

如果表中的数据很多,逐行检查锁标志的开销将很大,系统的性能将会受到影响。

为了解决这个问题,可以在表级引入新的锁类型来表示其所属行的加锁情况,这就引出了“意向锁”的概念。

意向锁的含义是如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁;对任一结点加锁时,必须先对它的上层结点加意向锁。

如:对表中的任一行加锁时,必须先对它所在的表加意向锁,然后再对该行加锁。

这样一来,事务对表加锁时,就不再需要检查表中每行记录的锁标志位了,系统效率得以大大提高。

2.2.2意向锁的类型由两种基本的锁类型(S锁、X锁),可以自然地派生出两种意向锁:意向共享锁(Intent Share Lock,简称IS锁):如果要对一个数据库对象加S锁,首先要对其上级结点加IS锁,表示它的后裔结点拟(意向)加S锁;意向排它锁(Intent Exclusive Lock,简称IX锁):如果要对一个数据库对象加X锁,首先要对其上级结点加IX锁,表示它的后裔结点拟(意向)加X锁。

另外,基本的锁类型(S、X)与意向锁类型(IS、IX)之间还可以组合出新的锁类型,理论上可以组合出4种,即:S+IS,S+IX,X+IS,X+IX,但稍加分析不难看出,实际上只有S+IX有新的意义,其它三种组合都没有使锁的强度得到提高(即:S+IS=S,X+IS=X,X+IX=X,这里的“=”指锁的强度相同)。

所谓锁的强度是指对其它锁的排斥程度。

这样我们又可以引入一种新的锁的类型共享意向排它锁(Shared Intent Exclusive Lock,简称SIX锁):如果对一个数据库对象加SIX锁,表示对它加S锁,再加IX锁,即SIX=S+IX。

例如:事务对某个表加SIX锁,则表示该事务要读整个表(所以要对该表加S锁),同时会更新个别行(所以要对该表加IX 锁)。

这样数据库对象上所加的锁类型就可能有5种:即S、X、IS、IX、SIX。

具有意向锁的多粒度封锁方法中任意事务T要对一个数据库对象加锁,必须先对它的上层结点加意向锁。

申请封锁时应按自上而下的次序进行;释放封锁时则应按自下而上的次序进行;具有意向锁的多粒度封锁方法提高了系统的并发度,减少了加锁和解锁的开销。

2.2.3Oracle的TM锁(表级锁)Oracle的DML锁(数据锁)正是采用了上面提到的多粒度封锁方法,其行级锁虽然只有一种(即X锁),但其TM锁(表级锁)类型共有5种,分别称为共享锁(S锁)、排它锁(X锁)、行级共享锁(RS锁)、行级排它锁(RX锁)、共享行级排它锁(SRX锁),与上面提到的S 、X 、IS 、IX 、SIX 相对应。

需要注意的是,由于Oracle 在行级只提供X 锁,所以与RS 锁(通过SELECT …FOR UPDATE 语句获得)对应的行级锁也是X 锁(但是该行数据实际上还没有被修改),这与理论上的IS 锁是有区别的。

下表为Oracle 数据库TM 锁的相容矩阵(Y=Yes ,表示相容的请求;N=No ,表示不相容的请求;-表示没有加锁请求):表一:Oracle 数据库TM 锁的相容矩阵一方面,当Oracle 执行SELECT…FOR UPDATE 、INSERT 、UPDATE 、DELETE 等DML 语句时,系统自动在所要操作的表上申请表级RS 锁(SELECT…FOR UPDATE )或RX 锁(INSERT 、UPDATE 、DELETE ),当表级锁获得后,系统再自动申请TX 锁,并将实际锁定的数据行的锁标志位置位(指向该TX 锁);另一方面,程序或操作人员也可以通过LOCK TABLE 语句来指定获得某种类型的TM 锁。

下表总结了Oracle 中各SQL 语句产生TM 锁的情况:表二:Oracle 数据库TM 锁小结我们可以看到,通常的DML 操作(SELECT…FOR UPDATE 、INSERT 、UPDATE 、DELETE ),在表级获得的只是意向锁(RS 或RX ),其真正的封锁粒度还是在行级;另外,Oracle 数据库的一个显著特点是,在缺省情况下,单纯地读数据(SELECT )并不加锁,Oracle 通过回滚段(Rollback segment )来保证用户不读“脏”数据。

这些都极大地提高了系统的并发程度。

由于意向锁及数据行上锁标志位的引入,极大地减小了Oracle 维护行级锁的开销,这些技术的应用使Oracle 能够高效地处理高度并发的事务请求。

T2T1S X RS RX SRX -S Y N Y N N Y X N N N N N Y RS Y N Y Y Y Y RX N N Y Y N Y SRX N N Y N N Y -YYYYYYSQL 语句表锁模式允许的锁模式Select *from table_name……无RS 、RX 、S 、SRX 、X Insert into table_name……RX RS 、RX Update table_name……RX RS 、RX Delete from table_name……RX RS 、RXSelect *from table_name for update RS RS 、RX 、S 、SRX lock table table_name in row share mode RS RS 、RX 、S 、SRX lock table table_name in row exclusive mode RX RS 、RX lock table table_name in share modeS RS 、S lock table table_name in share row exclusive mode SRX RS lock table table_name in exclusive modeX无3Oracle 多粒度封锁机制的监控3.1系统视图介绍为了监控Oracle 系统中锁的状况,我们需要对几个系统视图有所了解:3.1.1v$lock 视图v$lock 视图列出当前系统持有的或正在申请的所有锁的情况,其主要字段说明如下:表三:v$lock 视图主要字段说明其中在TYPE 字段的取值中,本文只关心TM 、TX 两种DML 锁类型;关于ID1、ID2,TYPE 取值不同其含义也有所不同:表四:v$lock 视图中ID1与ID2字段取值说明3.1.2v$locked_object 视图v$locked_object 视图列出当前系统中哪些对象正被锁定,其主要字段说明如下:字段名称类型说明SID NUMBER 会话(SESSION )标识;TYPE VARCHAR (2)区分该锁保护对象的类型;ID1NUMBER 锁标识1;ID2NUMBER 锁标识2;LMODE NUMBER 锁模式:0(None ),1(null ),2(row share ),3(row exclusive ),4(share ),5(share row exclusive ),6(exclusive )REQUEST NUMBER 申请的锁模式:具体值同上面的LMODE CTIME NUMBER 已持有或等待锁的时间;BLOCKNUMBER是否阻塞其它锁申请;TYPE ID1ID2TM 被修改表的标识(object_id )TX以十进制数值表示该事务所占用的回滚段号与该事务在该回滚段的事务表(Transaction table )中所占用的槽号(slot number ,可理解为记录号)。

其组成形式为:0xRRRRSSSS (RRRR =RBS number,SSSS =slot )。

以十进制数值表示环绕(wrap )次数,即该槽(slot )被重用的次数;字段名称类型说明XIDUSN NUMBER 回滚段号;XIDSLOT NUMBER 槽号;XIDSQN NUMBER 序列号;OBJECT_IDNUMBER被锁对象标识;SESSION_ID NUMBER持有锁的会话(SESSION)标识;ORACLE_USERNAME VARCHAR2(30)持有该锁的用户的Oracle用户名;OS_USER_NAME VARCHAR2(15)持有该锁的用户的操作系统用户名;PROCESS VARCHAR2(9)操作系统的进程号;LOCKED_MODE NUMBER锁模式,取值同表三中的LMODE;表五:v$locked_object视图字段说明3.2监控脚本根据上述系统视图,可以编制脚本来监控数据库中锁的状况。

相关文档
最新文档