orcl锁、
Oracle锁处理、解锁方法
Oracle锁处理、解锁⽅法1、查询锁情况select sid,serial#,event,BLOCKING_SESSION from v$session where event like '%TX%';2、根据SID查询具体信息(可忽略)select sid,serial#,username,machine,blocking_session from v$session where sid=<SID>;3、杀掉会话#根据1和2中查到的SID和SERIAL# 定位会话,并杀掉ALTER SYSTEM DISCONNECT SESSION '<SID>,<SERIAL>' IMMEDIATE;或ALTER SYSTEM KILL SESSION '<SID>,<SERIAL>';附件:#查询阻塞脚本col waiting_session for a20col lock_type for a15col mode_requested for a10col mode_held for a10col lock_id1 for a10col lock_id2 for a10set linesize 120set pagesize 999with dba_locks_cust as(SELECT inst_id||'_'||sid session_id,DECODE (TYPE,'MR', 'Media Recovery','RT', 'Redo Thread','UN', 'User Name','TX', 'Transaction','TM', 'DML','UL', 'PL/SQL User Lock','DX', 'Distributed Xaction','CF', 'Control File','IS', 'Instance State','FS', 'File Set','IR', 'Instance Recovery','ST', 'Disk Space Transaction','TS', 'Temp Segment','IV', 'Library Cache Invalidation','LS', 'Log Start or Switch','RW', 'Row Wait','SQ', 'Sequence Number','TE', 'Extend Table','TT', 'Temp Table',TYPE)lock_type,DECODE (lmode,0, 'None', /* Mon Lock equivalent */1, 'Null', /* N */2, 'Row-S (SS)', /* L */3, 'Row-X (SX)', /* R */4, 'Share', /* S */5, 'S/Row-X (SSX)', /* C */6, 'Exclusive', /* X */TO_CHAR (lmode))mode_held,DECODE (request,0, 'None', /* Mon Lock equivalent */1, 'Null', /* N */2, 'Row-S (SS)', /* L */3, 'Row-X (SX)', /* R */4, 'Share', /* S */5, 'S/Row-X (SSX)', /* C */6, 'Exclusive', /* X */TO_CHAR (request))mode_requested,TO_CHAR (id1) lock_id1,TO_CHAR (id2) lock_id2,ctime last_convert,DECODE (block,0, 'Not Blocking', /* Not blocking any other processes */1, 'Blocking', /* This lock blocks other processes */2, 'Global', /* This lock is global, so we can't tell */TO_CHAR (block))blocking_othersFROM gv$lock),lock_temp as(select * from dba_locks_cust),lock_holder as(select w.session_id waiting_session,h.session_id holding_session,w.lock_type,h.mode_held,w.mode_requested,w.lock_id1,w.lock_id2from lock_temp w, lock_temp hwhere h.blocking_others in ('Blocking','Global')and h.mode_held != 'None'and h.mode_held != 'Null'and w.mode_requested != 'None'and w.lock_type = h.lock_typeand w.lock_id1 = h.lock_id1and w.lock_id2 = h.lock_id2),lock_holders as(select waiting_session,holding_session,lock_type,mode_held,mode_requested,lock_id1,lock_id2from lock_holderunion allselect holding_session, null, 'None', null, null, null, nullfrom lock_holderminusselect waiting_session, null, 'None', null, null, null, nullfrom lock_holder)select lpad(' ',3*(level-1)) || waiting_session waiting_session,lock_type,mode_requested,mode_held,lock_id1,lock_id2from lock_holdersconnect by prior waiting_session = holding_sessionstart with holding_session is null;总结以上所述是⼩编给⼤家介绍的Oracle锁处理、解锁⽅法,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。
Oracle的五种锁
Oracle的五种Table LockOracle中的锁定可以分为几类:DML lock(data lock),DDL lock(dictionary lock)和internal lock/latch。
DML lock又可以分为row lock和table lock。
row lock在select.. for update/insert/update/delete时隐式自动产生,而table lock除了隐式产生,也可以调用lock table in name来显示锁定。
如果不希望别的session lock/insert/update/delete表中任意一行,只允许查询,可以用lock table table_name in exclusive mode。
(X)这个锁定模式级别最高,并发度最小。
如果允许别的session查询或用select for update锁定记录,不允许insert/update/delete,可以用lock table table_name in share row exclusive mode。
(SRX)如果允许别的session查询或select for update以及lock table table_name in share mode,只是不允许insert/update/delete,可以用lock table table_name in share mode。
(share mode和share row exclusive mode的区别在于一个是非抢占式的而另一个是抢占式的。
进入share row exclusive mode后其他session不能阻止你insert/update/delete,而进入share mode后其他session也同样可以进入share mode,进而阻止你对表的修改。
(S)还有两种锁定模式,row share(RS)和row exclusive(RX)。
oracle锁原理
oracle锁原理Oracle数据库系统是当今最为流行和广泛使用的关系型数据库管理系统之一。
在Oracle中,锁是实现并发控制的重要机制之一。
本文将探讨Oracle锁的原理,包括锁的种类、分级和适用场景等。
一、概述在多用户并发访问的数据库环境中,锁的作用是确保数据的完整性和一致性。
Oracle中的锁可以分为共享锁(Shared Lock)和排他锁(Exclusive Lock)两种类型。
1. 共享锁(Shared Lock)共享锁允许多个事务同时读取同一个数据对象,但不允许对该数据对象进行修改。
当一个事务获取了共享锁后,其他事务只能再获取共享锁,而不能获取排他锁。
共享锁之间是兼容的,可以共存。
2. 排他锁(Exclusive Lock)排他锁是最严格的锁类型,它在事务需要修改数据对象时才会被获取。
当一个事务获取了排他锁后,其他事务无法同时获取共享锁或排他锁,保证了数据对象的独占性。
二、锁的级别Oracle中的锁按照锁住范围的不同可以分为表级锁(Table Lock)和行级锁(Row Lock)两种级别。
1. 表级锁(Table Lock)表级锁是对整个表进行加锁,当一个事务对某个表加锁时,其他事务无法修改该表中的任何数据。
表级锁的粒度大,锁的冲突较多,对并发性能有一定的影响,因此在实际应用中尽量避免使用表级锁。
2. 行级锁(Row Lock)行级锁是对表中的每一行进行加锁,当一个事务对某一行加锁时,其他事务可以同时对其他行进行修改。
行级锁的粒度小,锁的粒度细,可以提高并发性能。
Oracle通过使用多版本并发控制(Multi-Version Concurrency Control,MVCC)来实现行级锁。
三、锁的控制策略Oracle通过以下几种控制策略来管理锁:1. 乐观并发控制(Optimistic Concurrency Control,OCC)乐观并发控制假设并发事务之间的冲突较少,因此允许事务在修改数据时不获取锁,而是在提交时检测是否有冲突发生。
oracle锁原理
Oracle锁原理详解1. 概述在Oracle数据库中,锁是用于控制并发访问的一种机制。
当多个用户同时访问数据库时,为了保证数据的一致性和完整性,Oracle会对数据进行加锁,以防止其他用户对数据的修改。
本文将详细介绍Oracle锁的基本原理。
2. 锁的类型Oracle中的锁可以分为两种类型:共享锁(Shared Lock)和排他锁(Exclusive Lock)。
•共享锁:多个事务可以同时获取共享锁,并且可以并发读取数据,但不能修改数据。
共享锁用于保证数据的一致性,即多个事务可以同时读取相同的数据,但不能同时修改数据。
•排他锁:只有一个事务可以获取排他锁,并且其他事务不能同时获取共享锁或排他锁。
排他锁用于保证数据的完整性,即一个事务在修改数据时,其他事务不能同时读取或修改数据。
3. 锁的级别Oracle中的锁可以分为多个级别,包括表级锁、行级锁和字段级锁。
•表级锁:锁定整个表,阻止其他事务对表的修改。
表级锁对于大型表来说,可能会导致性能问题,因为它会阻塞其他事务的访问。
•行级锁:锁定表中的一行数据,其他事务可以并发读取其他行的数据。
行级锁可以更细粒度地控制并发访问,但可能会导致死锁问题。
•字段级锁:锁定表中的一个或多个字段,其他事务可以并发读取或修改其他字段的数据。
字段级锁可以进一步细化锁的粒度,但也可能导致死锁问题。
4. 锁的控制Oracle中的锁由数据库管理系统(DBMS)自动控制,用户无需手动操作。
当一个事务对数据进行修改时,DBMS会自动为该数据加上相应的锁,并在事务提交或回滚后释放锁。
锁的控制是通过锁定机制和并发控制机制实现的。
•锁定机制:当一个事务对数据进行修改时,DBMS会自动为该数据加上相应的锁。
锁定机制可以保证在并发访问时,每个事务都能正确地读取和修改数据。
•并发控制机制:当多个事务同时访问数据库时,DBMS会根据事务的隔离级别来控制并发访问。
并发控制机制可以避免脏读、不可重复读和幻读等问题。
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的锁机制是一种轻量级的锁定机制,不是通过构建锁列表来进行数据的锁定管理,而是直接将锁作为数据块的属性,存储在数据块首部。
这个是通过ITL来实现的,一个事务要修改块中的数据,必须获得该块中的一个itl。
二、为什么需要锁:oracle为什么好好的要搞一个锁(l ock)机制出来呢?很简单,那是因为需要它。
想想看我们自己家的门为什么要锁起来呢?这个我们肯定都知道怕家里的东西丢失或被别人拿走,如果没有别的人家世界就你一家那就没有必要锁门。
oracl e里锁也是一个道理,如果是单用户的系统,那完全没有必要这个锁,就是因为有多用户并发操作,我们为了确保资源的安全性(也就是oracl e的数据完整性和一致性)才引申出这个锁出来。
Oracle 利用其锁机制来实现事务间的数据并发访问及数据一致性。
三、锁的模式:oracl e有两种模式的锁:排他锁(exclusive lock,即X锁)和共享锁(share l ock,即S锁)。
南京宝云ocp课程开课啦~当数据对象被加上排它锁时,其他的事务不能对它读取(可以读取und o)和修改。
加了共享锁的数据对象可以被其他事务读取,但不能修改。
数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。
四、锁的类型:根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁):用于保护数据的完整性。
DDL锁(dictionary l ocks,字典锁):用于保护数据库对象的结构,如表、索引等的结构定义。
内部锁和闩(internal l ocks and latches):保护数据库的内部结构,例如,数据文件。
内部锁及闩锁的管理完全由Oracle 自动完成。
oracle 锁 详解
oracle 锁详解
Oracle中的锁分为两种:悲观锁和乐观锁。
悲观锁:
悲观锁的思想是认为并发环境中,总有其他会话会修改或者查询同一
数据,因此在操作前先将数据锁住,阻塞其他会话的操作,等待当前会话
完成后再释放锁。
Oracle中的悲观锁主要有行锁和表锁。
行锁:
行锁是针对数据表中特定行的锁定机制。
当一个事务拥有了某行记录
的锁时,其他事务就不能操作该行记录,直到该行记录被锁定的会话释放锁。
Oracle中行锁基于行级锁定机制实现。
通过行级锁定机制,只锁住
需要修改的数据行,而不会锁住整个数据表,这样能大大缩短了锁定时间,提高了并发度。
表锁:
表锁则是针对数据表的锁定机制。
在锁定表后,其他会话便无法进行
任何操作,包括读取、修改、删除等。
表锁的粒度较大,对系统的性能影
响比较大,因此尽可能避免对整个表进行锁定。
乐观锁:
乐观锁认为并发环境下操作冲突的概率较小,因此不会在执行前对数
据进行加锁,而是在提交操作时对数据进行版本控制,若发现数据已被其
他会话修改,则拒绝当前会话的提交。
Oracle中的乐观锁主要基于乐观
并发控制(Optimistic Concurrency Control)实现。
总体上说,悲观锁在并发较高的环境中表现更加稳定可靠,但会增加系统的开销;乐观锁在并发较低且读操作多于写操作的情况下表现更好,但在高并发、写操作频繁的环境中,容易出现冲突,需要进行版本回滚或者重试操作,增加了系统的复杂度。
oracle锁表查询和解锁方法
oracle锁表查询和解锁方法一、锁表查询1.使用“行锁”的“for update”子句“for update”子句可以显式地锁定表中的行,以防止其他用户在数据没有更新之前更改或删除它们。
您可以在SELECT语句后使用“for update”子句来锁定表中的特定行:SELECT empno, enameFROM employeesWHERE deptno = 10FORUPDATE;如果您希望锁定整个表,请加上“OF”关键字:SELECT empno, enameFROM employeesWHERE deptno = 10FOR UPDATE OF empno;当在“of”后面指定列名时,它表示你想要锁定此列中的所有行。
这意味着其他会话只能读取此表,但不能修改任何满足WHERE子句的行。
要确保SQL语句完全执行,您必须提交事务。
2.使用“表锁”的“lock table”您可以使用“lock table”语句来锁定表。
lock table用于管理和表中的数据不受任何其他用户影响的场合。
它有三种锁定模式:共享(shared)、排他(exclusive)和混合(mixed)。
lock table table_name in exclusive mode;通常,你将锁定表以防止其他用户以任何方式更改。
共享模式锁定表并允许其他用户从表中选择数据,而排他模式锁定除了选择以外的所有指令。
为了防止其他会话使用SELECT语句,可以使用混合模式。
混合模式允许其他进程只进行SELECT操作。
要确保锁定表,您可以提交事务或回滚事务:请注意,如果您锁定任何表,您必须确保提交或回滚事务,否则其他会话将无法进行任何操作。
二、解锁表。
oracle 锁 写法
oracle 锁写法
在Oracle数据库中,锁可以通过不同的方式来实现。
最常见的锁包括排他锁和共享锁。
在Oracle中,可以使用以下语句来实现锁定:
1. 排他锁(Exclusive Lock):在Oracle中,可以使用FOR UPDATE语句来对数据行进行排他锁定。
例如:
sql.
SELECT FROM table_name FOR UPDATE;
这将对查询结果集中的数据行进行排他锁定,其他会话将无法修改这些数据行,直到当前会话释放锁。
2. 共享锁(Shared Lock):在Oracle中,可以使用LOCK TABLE语句来对整个表进行共享锁定。
例如:
sql.
LOCK TABLE table_name IN SHARE MODE;
这将对整个表进行共享锁定,其他会话可以读取表中的数据,但是无法对表进行修改,直到当前会话释放锁。
除了以上两种基本的锁定方式,Oracle还提供了更细粒度的锁定机制,如行级锁、表级锁等。
可以通过在SQL语句中使用FOR UPDATE OF子句或者使用LOCK TABLE语句的不同模式来实现这些更细粒度的锁定。
需要注意的是,在使用锁定时,应该谨慎考虑锁定的范围和持续时间,避免对系统性能造成不必要的影响。
另外,Oracle数据库还提供了事务隔离级别的设置,可以通过设置事务隔离级别来控制锁的行为,以满足不同的业务需求。
总而言之,Oracle数据库提供了多种方式来实现锁定,开发人员可以根据具体的业务需求选择合适的锁定方式,并且需要注意锁定的范围和持续时间,以及事务隔离级别的设置。
Oracle的锁有几种模式
Oracle的锁有几种模式
4:Share 共享锁(S): 阻止其他DML操作5:S/Row-X 共享行专用(SRX): 阻止其他事务操作6:exclusive 专用(X): 独立访问使用以上可以看出,数字越大的锁影响的操作越多,锁的级别越高。
一般的查询语句是小于2的锁,如select * from *select …from …for update 是2的锁,这时候返回集的数据行都将处于行级(Row-X)独占式锁定,其他对象只能对这些数据进行查询,而不能进行更新或者select for update操作。
insert/update/delete是3的锁,在这些操作没有commit之前插入同样的记录会没有反应,因为3的锁必须要等到前一个3的锁执行释放掉以后才能继续。
创建索引的时候也会产生3,4级别的锁。
locked_mod为2,3,4的锁,不影响DML (insert,delete,update,select)操作,但是DDL(alter,drop)等修改表结构的操作会提示ora-00054错误。
当有主外键约束时执行update/delete操作可能会产生4,5的锁。
DDL语句时是6的锁。
1。
oracle 锁详解
oracle 锁详解在 Oracle 数据库中,锁(Lock)用于控制并发访问和确保数据的一致性。
锁是一种机制,它可以限制对特定资源(如表、行、记录等)的访问,以防止并发事务之间的冲突和数据不一致。
Oracle 中的锁可以分为以下几种类型:1. **共享锁(Shared Lock)**:也称为读锁,用于读取数据并确保多个事务可以同时读取相同的数据,而不会相互阻塞。
共享锁可以与其他共享锁共存,但与排他锁互斥。
2. **排他锁(Exclusive Lock)**:也称为写锁,用于对数据进行写入操作,并确保在同一时间只有一个事务可以获取排他锁。
排他锁会阻止其他事务获取共享锁或排他锁。
3. **行级锁 (Row-Level Lock)**:用于锁定表中的特定行,以提供更细粒度的并发控制。
行级锁可以是共享锁或排他锁。
4. **表级锁(Table-Level Lock)**:用于锁定整个表,阻止其他事务对表进行读写操作。
表级锁通常会影响并发性能,因此在 Oracle 中较少使用。
Oracle 数据库自动管理和协调锁的获取和释放。
在执行 DML (数据操作语言)语句时,Oracle 会根据需要自动获取适当类型的锁。
例如,在执行 SELECT 语句时,Oracle 会获取共享锁;而在执行 INSERT、UPDATE 或 DELETE 语句时,Oracle 会获取排他锁。
锁的粒度和类型可以根据事务的隔离级别进行设置。
Oracle 提供了多种隔离级别,如 READ COMMITTED、SERIALIZABLE 等,每个隔离级别都对应不同的锁行为。
了解和管理锁对于确保数据库的并发性能和数据一致性非常重要。
Oracle 数据库提供了一些视图和工具来监控和诊断锁的信息,例如 V$LOCK、V$SESSION 等视图。
如果在应用程序中遇到锁冲突或性能问题,可以使用这些工具来分析和解决锁相关的问题。
请注意,以上是 Oracle 锁的一些基本概念和类型,Oracle 数据库的锁机制非常复杂,并且还有其他更高级的锁类型和特性。
oracle锁原理
oracle锁原理标题:Oracle锁原理:保证数据一致性和并发性的关键机制引言:在数据库系统中,数据的一致性和并发性是非常重要的。
在多用户并发访问数据库时,可能出现脏读、不可重复读、幻读等问题。
为了解决这些问题,Oracle数据库引入了锁机制,以确保数据的一致性和并发性。
本文将介绍Oracle数据库中锁的原理和不同类型的锁。
一、锁的概念锁是对数据对象(如表、行、页等)的一种保护机制,通过对数据对象施加锁,限制其他事务对其进行修改,以保证数据的一致性和并发性。
锁可分为共享锁(Shared Lock)和排他锁(Exclusive Lock)两种类型。
二、Oracle锁的类型1. 表级锁(Table Level Locks)表级锁是对整个表进行锁定,当一个事务对表进行修改时,会锁定整个表,其他事务无法对该表进行并发操作。
表级锁适用于对整个表进行大规模数据修改的场景,例如表重建、重复数据删除等。
2. 行级锁(Row Level Locks)行级锁是对表中的行进行锁定,当一个事务对某一行进行修改时,会锁定该行,其他事务可以对其他行进行并发操作。
行级锁可以细化锁的粒度,提高并发性能。
Oracle数据库使用行级锁的方式是通过使用“行级共享锁”(RS)和“行级排他锁”(RX)两种类型的锁来实现。
3. 页级锁(Page Level Locks)页级锁是对表的页进行锁定,当一个事务对某一页进行修改时,会锁定该页,其他事务可以对其他页进行并发操作。
页级锁适用于大型表上的并发操作。
三、锁的获取和释放在Oracle数据库中,锁的获取和释放是自动进行的,无需手动干预。
当一个事务需要对一个对象进行修改时,会自动获取相应的锁。
事务提交或回滚后,会自动释放相关的锁。
Oracle数据库的锁管理是一个复杂的内部机制,通过各种算法和数据结构来管理锁的获取和释放。
四、锁的粒度和成本在实际应用中,锁的粒度和成本需要权衡。
如果锁的粒度过大,会导致并发性能下降;如果锁的粒度过小,会导致锁管理的开销增加。
oracle 锁的概论
oracle 锁的概论
Oracle数据库中的锁是一种重要的概念,它们用于控制并发访问数据库中的数据。
锁可以分为不同的类型,包括行级锁、表级锁和数据库级锁。
在Oracle中,锁可以用于保护数据的一致性,防止并发事务对同一数据进行不一致的操作。
首先,让我们来谈谈行级锁。
行级锁是针对数据库表中的行进行的锁定操作。
当一个事务需要修改某一行的数据时,它会获取该行的行级锁,这样其他事务就无法同时修改这一行的数据,从而保证了数据的一致性。
行级锁可以通过SELECT ... FOR UPDATE语句来实现,在更新或删除操作时自动获取。
其次,表级锁是针对整个表的锁定操作。
当一个事务需要对整个表进行操作时,它会获取表级锁,这会阻止其他事务对整个表进行修改操作,从而保证了数据的完整性。
表级锁可以通过LOCK TABLE语句来实现。
此外,Oracle还支持数据库级锁,它可以用于对整个数据库进行锁定操作,从而限制其他用户对数据库的访问。
数据库级锁可以通过ALTER SYSTEM语句来实现。
需要注意的是,锁在提高数据一致性的同时也会带来一定的性能损耗。
过多的锁定操作可能会导致数据库的性能下降,因此在设计数据库应用程序时需要合理地使用锁,避免出现死锁等问题。
总的来说,Oracle数据库中的锁是确保数据一致性和完整性的重要手段,不同类型的锁可以用于不同粒度的数据保护,合理地使用锁对于数据库的性能和数据完整性都非常重要。
希望这些信息能够帮助你更好地理解Oracle数据库中的锁机制。
ORACLE_锁管理大全
ORACLE锁的管理锁概念基础数据库是一个多用户使用的共享资源。
当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。
若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
加锁是实现数据库并发控制的一个非常重要的技术。
当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。
加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。
在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。
当数据对象被加上排它锁时,其他的事务不能对它读取和修改。
加了共享锁的数据对象可以被其他事务读取,但不能修改。
数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。
Oracle数据库的锁类型根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护数据库的内部结构。
DML锁的目的在于保证并发情况下的数据完整性,。
在Oracle数据库中,DML锁主要包括TM 锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。
当Oracle 执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。
当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。
这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。
TM锁包括了SS、SX、S、X 等多种模式,在数据库中用0-6来表示。
不同的SQL操作产生不同类型的TM锁。
在数据行上只有X锁(排他锁)。
在 Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。
ORACLE基础之oracle锁(oraclelockmode)详解
ORACLE基础之oracle锁(oraclelockmode)详解ORACLE⾥锁有以下⼏种模式:0:none1:null 空2:Row-S ⾏共享(RS):共享表锁,sub share3:Row-X ⾏独占(RX):⽤于⾏的修改,sub exclusive4:Share 共享锁(S):阻⽌其他DML操作,share5:S/Row-X 共享⾏独占(SRX):阻⽌其他事务操作,share/sub exclusive6:exclusive 独占(X):独⽴访问使⽤,exclusive1.oracle提供的所类型可以根据v$lock_type 中的type来查询,我们平时接触的最多的是两种select * from v$lock_type where type in ('TM','TX')查看描述,可以⼤概的得知两种锁的信息.TM是同步访问对象⽤的,TX是和事务有关的.2.要知道的有2个概念:(1).锁定数据的锁,也就是⾏级锁,只有⼀种:排它锁 exclusive (ROW)(2).锁定表上的锁,即锁定元数据的锁 metadata(table),⼀共有5种:RS: row shareRX: row exclusiveS: shareSRX: share row exclusiveX: exclusive4.根据oracle联机⽂档的concepts的 我们可以从这个表找出⾄少2个东西,.第⼀是每种数据库操作都对应的是什么样的锁(参考中间那⼀列),第⼆是每种锁之间,如果遇到之后是否会产⽣冲突,所谓冲突就是是否会使当前的数据库操作夯住.其中Y*,表⽰如果两个操作锁定的是同⼀⾏,那么就会有冲突,后操作的会等待前⼀个操作完成之后再完成,否则会⼀直夯在那⼉;如果不为同⼀⾏,那么则不会冲突,后操作的不会等待.举⼀个例⼦来说明:假设现在A操作为:对id=1的记录进⾏update,⽽B操作为:对id=2的记录进⾏删除,根据表格说明,在A上操作时在TM级别的锁会是RX,TX级别只有⼀个是X,在B上会有⼀个TM级别的锁会是RX,TX级别只有⼀个X,⽽根据表格说明,当RX遇到RX的时候,如果2个操作⾮同⼀条记录,那么则不会冲突,故AB两个操作均会按照各⾃的先加⼀个TM锁,再加⼀个TX锁,再顺利执⾏各⾃的操作,不会夯住。
Oracle数据库表被锁了,如何解锁
Oracle数 据 库 表 被 锁 了 , 如 何 解 锁
1. 首先查看数据库中哪些表被锁了,找到session ID: 使用sql: select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id; OWNER :数据表的所有者用户 OBJECT_NAME: 被锁住的表名 SESSION_ID: 会话ID LOCKED_MODE: 锁级别 锁级别分为6级: 1级锁有:Select 2级锁有:Select for update,Lock For Update,Lock Row Share 3级锁有:Insert, Update, Delete, Lock Row Exclusive 4级锁有:Create Index, Lock Share 5级锁有:Lock Share Row Exclusive 6级锁有:Alter table, Drop table, Drop Index, Truncate table, Lock Exclusive 2.再执行该语句,查看会话id select ername,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order by b.logon_time; 3.杀会话 alter system kill session 'sid,serial#'; 例子:
ORACLE锁的几种模式
3. 只要需要,就应该尽可能长时间地保持对数据所加的锁。这些锁是你能利用的工具,而不是让你退避三舍的东西。锁不是稀有资源。恰恰相反,只要需要,你就应该长期地保持数据上的锁。锁可能并不稀少,而且它们可以防止其他会话修改信息。
4. 在Oracle中,行级锁没有相关的开销,根本没有。不论你是有1个行锁,还是1 000 000个行锁,专用于锁定这个信息的“资源”数都是一样的。当然,与修改1行相比,修改1 000 000行要做的工作肯定多得多,但是对1 000 000行锁定所需的资源数与对1行锁定所需的资源数完全相同,这是一个固定的常量。
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;
如果有长期出现的一列,可能是没有释放的锁。
我们可以用下面SQL语句杀掉长期没有释放非正常的锁:
3:Row-X 行专用(RX):用于行的修改
4:Share 共享锁(S):阻止其他DML操作
5:S/Row-X 共享行专用(SRX):阻止其他事务操作
6:exclusive 专用(X):独立访问使用
数字越大锁级别越高, 影响的操作越多。
一般的查询语句如select ... from ... ;是小于2的锁, 有时会在v$locked_object出现。
insert / update / delete ... ; 是3的锁。
没有commit之前插入同样的一条记录会没有反应,
因为后一个3的锁会一直等待上一个3的锁, 我们必须释放掉上一个才能继续工作。
创建索引的时候也会产生3,4级别的锁。
锁的介绍
ORACLE锁
ORACLE锁开发多用户、数据库驱动的应用时,最大的难点之一:一方面要力争取得最大限度的并发访问,与此同时还要确保每个用户能以一致的方式读取和修改数据;为此就有了锁定(locking)机制。
锁(lock)机制用于管理对共享资源的并发访问,同时还能提供数据完整性和一致性。
有多少种数据库,其中就可能有多少种实现锁定的方法。
时刻记住以下两点:1、所有数据库本质上都不同。
2、为一个新的数据库平台设计应用时,对于数据库如何工作不能做任何假设。
如SQL Server利用聚簇索引,就能按聚簇键的顺序在整个表中插入行(而不是只在表的末尾插入),以改善SQL Server数据库的并发性。
而且默认情况下,SQL Server每执行一条语句后就会立即提交或回滚。
这样为了得到更大的并发性,但是会破坏事务完整性。
在Oracle中事务是每个数据库的核心在必要时才提交,不要太快提交,以避免对系统带来压力。
事务的大小只应该根据业务逻辑来定。
只要需要,就应该尽可能长时间地保持对数据所加的锁。
行级锁没有相关的开销,根本没有。
不论你是有1个行锁,还是1000000个行锁,专用于锁定这个信息的“资源”数都是一样的。
不同级别的锁的开销是一样的数据读取器不会被数据写入器阻塞。
数据写入器也不会被数据读取器阻塞。
一、锁定问题:丢失更新;需要使用某种锁定策略,共有两种锁定策略:悲观锁定或乐观锁定。
1、悲观锁定;在试图更新之前我们就把行锁住了。
2、乐观锁定;锁定都延迟到即将执行更新之前才做。
执行更新的失败可能性会加大。
实现方法有很多,以下介绍四种:a、在应用中同时保留旧值和新值,存储行的所有“前”(before)映像。
b、使用版本列的乐观锁定;版本维护:应用、存储、触发器(开销较大)。
c、使用校验和的乐观锁定;计算散列或校验和有很多方法。
计算散列或校验和是一个CPU密集型操作,相当占用CPU。
如果从网络开销角度看,计算散列或校验和只需在网络上传输相当小的散列值,而不是行的完整的前映像和后映像。
Oracle数据库中锁、序列、索引管理
详析Oracle数据库中锁、序列、索引管理一、锁1.1什么是锁数据库是一个多用户使用的共享资源。
当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。
若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
而锁就是用于控制事务对数据的访问,实现事务的并发控制,保持数据库的一致性。
1.2锁的类型DDL锁:被Oracle自动的发布和释放DML锁:在事务处理的开始时被施加,而且在事务处理完成时被释放(使用Commit 或Rollback时被释放)内部锁:由Oracle自己管理以保护内部数据库结构注:DDL锁由数据库自动管理;DML锁和内部锁可以由用户直接或间接管理。
1.3锁的粒度1)TX锁:行级锁(事务锁),会阻止这行上其它DML操作,直到Commit或Rollback 时被释放,它只有X排他锁2)TM锁:表级锁。
2.1)Row-S 行共享(RS):共享行锁,即可被其他事务查询该行。
2.2)Row-X 行专用(RX):用于行的修改,即禁止其他事务对该行的所有操作。
2.3)Share 共享锁(S):阻止其他DML操作2.4)S/Row-X 共享行专用(SRX):阻止其他事务操作2.5)exclusive 专用(X):独立访问使用3)数据库级锁:锁定数据库为限制模式alter system enable restricted session;以下语句将锁定数据库为只读模式startup mount;alter database open read only;1.4锁的模式和使用1)共享锁(Share Table Lock,S):使用情况:当执行事务时,事务所要操作的表不希望被别的事务更新时可以使用。
即某表被加锁后只能被加锁的事务全权控制,其他事务只能对该表执行查询操作。
加锁语法:Lock Table TableName In Share Mode;使用度:中。
当对表执行大面积更新操作时可使用,反之,则不用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
锁描述锁是防止在两个事务操作同一个数据源(表或行)时交互破坏数据的一种机制。
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):排它锁是在锁机制中限制最多的一种锁类型,允许加排它锁的事务独自控制对表的写权限。
加锁语法:Lock Table TableName In Exclusive Mode;允许的操作:在一个表中只能有一个事务对该表实行排它锁,排它锁仅允许其它的事务查询该表。
禁止的操作:拥有排外锁的事务禁止其它事务执行其它任何DML类型的语句或在该表上加任何其它类型的锁。
定义排它锁的语法:LOCK TABLE TableName IN EXCLUSIVE MODE;3. 行级锁(Row Share Table Lock,RS):一个行级锁(有时称为Subshare Table Lock,简称SS,子共享锁)需要该事务在被锁定行的表上用update的形式加锁。
当有下面语句被执行的时候行级锁自动加在操作的表上。
SELECT . . . FROM TableName. . . FOR UPDATE OF . . . ;LOCK TABLE TableName IN ROW SHARE MODE;行级锁(Row Share Table Lock)在锁类型中是限制最少的,也是在表的并发程度中使用程度最高的。
允许的操作:行级共享锁由一个事务控制,允许其它事务查询、插入、更新、删除或同时在同一张表上锁定行。
因此其它事务可以同时在同一张表上得到行级锁、共享行级排它锁、行级排它锁、排它锁。
参见数据锁的相容矩阵图禁止的操作:拥有行级锁的事务不允许其它事务执行排它锁,即:Lock Table TableNameIn Exclusive Mode;4. 行级排它锁(Row Exclusive Table Lock,RX):行级排它锁(亦称为Subexclusive Table Lock,简称SX,子排它锁)通常需要事务拥有的锁在表上被更新一行或多行。
当有下面语句被执行的时候行级排它锁被加在操作的表上。
INSERT INTO TableName. . . ;UPDATE TableName. . . ;DELETE FROM TableName. . . ;LOCK TABLE TableName IN ROW EXCLUSIVE MODE;行级排它锁比行级锁稍微多一些限制。
允许的操作:在数据锁的相容矩阵图很容易看出行级排它锁由一个事务拥有允许其它事务执行查询、修改、插入、删除或同时在同一张表上锁定行。
执有行级排它锁的事务允许其它事务在同一张表上同时得到共享锁和行级排它锁。
禁止的操作:行级排它锁由一个事务拥有防止其它事务手动锁定表来排除其它事务的读写权。
因此,其它事务不允许在同一张表上使用以下的语句来执行锁事务。
LOCK TABLE table IN SHARE MODE;LOCK TABLE table IN SHARE EXCLUSIVE MODE;LOCK TABLE table IN EXCLUSIVE MODE5. 共享行级排它锁(Share Row Exclusive Table Lock,SRX):共享行级排它锁有时也称共享子排它锁(Share Subexclusive Table Lock,SSX),它比共享锁有更多限制。
定义共享行级排它锁的语法为:Lock Table TableName In Share Row Exclusive Mode;允许的操作:仅允许一个事务在某一时刻得到行级排它锁。
拥有行级排它锁事务允许其它事务在被锁定的表上执行查询或使用Select …From TableName For update…来准确在锁定行而不能更新行。
禁止的操作:拥有行级排它锁的事务不允许其它事务有除共享锁外的其它形式的锁加在同一张表上或更新该表。
即下面的语句是不被允许的:LOCK TABLE TableName IN SHARE MODE;LOCK TABLE TableName IN SHARE ROW EXCLUSIVE MODE;LOCK TABLE TableName IN ROW EXCLUSIVE MODE;LOCK TABLE TableName IN EXCLUSIVE MODE;DML语句获得的DML自动锁(Oracle隐含锁)DML自动锁的相容矩阵图:X:排它锁、RS:行级共享锁、RX:行级排它锁、S、共享锁、RSX:行级共享排它锁死锁-deadlock定义:当两个用户希望持有对方的资源时就会发生死锁.即两个用户互相等待对方释放资源时,oracle认定为产生了死锁,在这种情况下,将以牺牲一个用户作为代价,另一个用户继续执行,牺牲的用户的事务将回滚.例子:1:用户1对A表进行Update,没有提交。
2:用户2对B表进行Update,没有提交。
此时双反不存在资源共享的问题。
3:如果用户2此时对A表作update,则会发生阻塞,需要等到用户一的事物结束。
4:如果此时用户1又对B表作update,则产生死锁。
此时Oracle会选择其中一个用户进行会滚,使另一个用户继续执行操作。
起因:Oracle的死锁问题实际上很少见,如果发生,基本上都是不正确的程序设计造成的,经过调整后,基本上都会避免死锁的发生。
锁查询1.查询数据库中的锁select * from v$lock;select * from v$lock where block=1;2.查询被锁的对象select * from v$locked_object;3.查询阻塞查被阻塞的会话select * from v$lock where lmode=0 and type in ('TM','TX');查阻塞别的会话锁select * from v$lock where lmode>0 and type in ('TM','TX');4.查询数据库正在等待锁的进程select * from v$session where lockwait is not null;5.查询会话之间锁等待的关系select a.sidholdsid,b.sid waitsid,a.type,a.id1,a.id2,a.ctime from v$locka,v$lock b where a.id1=b.id1 and a.id2=b.id2 and a.block=1 and b.block=06.查询锁等待事件select * from v$session_wait where event='enqueue';视图描述2.其它相关视图说明/wuxi/archive/2012/10/10/2718151.html必须在sqlplus中执行;ora-02049解决一例===========================================================作者: guyeh()发表于:2008.09.10 16:25分类: 数据库出处:/post/34115/470617---------------------------------------------------------------死锁是数据库经常发生的问题,数据库一般不会无缘无故产生死锁,死锁通常都是由于我们应用程序的设计本身造成的。
产生死锁时,如何解决呢,下面是常规的解决办法:1)执行下面SQL,先查看哪些表被锁住了:select b.owner,b.object_name,a.session_id,a.locked_modefrom v$locked_objecta,dba_objects bwhere b.object_id = a.object_id;2)查处引起死锁的会话select ername,b.sid,b.serial#,logon_timefrom v$locked_objecta,v$session bwhere a.session_id = b.sid order by b.logon_time;这里会列出SID3)查出SID和SERIAL#:查V$SESSION视图:SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='刚才查到的SID';这一步将得到PADDR4)查V$PROCESS视图:SELECT SPID FROM V$PROCESS WHERE ADDR='刚才查到的PADDR';这一步得到SPID5)杀死进程(1)在数据库中,杀掉ORACLE进程:ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#';执行存储过程更新一个表中的数据的时候产生如下的错误:SQL> exec update_jc_kxx_yxrq;beginupdate_jc_kxx_yxrq; end;ORA-20998: Err=-2049,Msg=0-ORA-02049: 超时: 分布式事务处理等待锁定ORA-06512: 在"ICUSER.UPDATE_JC_KXX_YXRQ", line 36ORA-06512: 在line 2以sys用户登陆数据库查询死锁SQL> select username,lockwait,status,machine,program from v$session where sid in (select session_id from v$locked_object);USERNAME LOCKWAIT STATUS------------------------------ ---------------- --------MACHINE----------------------------------------------------------------PROGRAM------------------------------------------------icdbJDBC Thin ClientICUSER 000000038A37C0C8 ACTIVEicdbJDBC Thin Client说明数据库有死锁然后使用一下语句查找被死锁的语句SQL> select sql_text from v$sql where hash_valuein(select sql_hash_value from v$session where sid in(select session_id from v$locked_object));SQL_TEXT--------------------------------------------------------------------------------update JC_KXX SET LJXF =NVL ( LJXF , 0 ) + :1 , YE =:2 WHERE KH =:3update jc_kxx set zt='07' where kh='1000530330'再使用以下语句查找被死锁的进程SQL> SELECT ername,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESSFROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID; USERNAME OBJECT_ID SESSION_ID SERIAL#------------------------------ ---------- ---------- ----------ORACLE_USERNAME OS_USER_NAME PROCESS------------------------------ ------------------------------ ------------ICUSER 30523 32 42463ICUSER oracleICUSER 30523 28 25508ICUSER oracleICUSER 30523 76 14781ICUSER oracleUSERNAME OBJECT_ID SESSION_ID SERIAL#------------------------------ ---------- ---------- ----------ORACLE_USERNAME OS_USER_NAME PROCESS------------------------------ ------------------------------ ------------ICUSER 30523 24 37522ICUSER oracle使用一下语句把死锁的进程killalter system kill session ‘sid,serial#’; (其中sid=l.session_id)如:SQL> alter system kill session '24,37522';再次执行存储过程,错误没有了。