Oracle中锁的产生和解锁
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中加锁与解锁

oracle加锁⽅式,oracle中加锁与解锁oracle中的数据在并发操作时,为了防⽌错误的发⽣可以进⾏记录或者数据库表的加锁操作。
当锁操作完成时可以进⾏解锁操作。
数据库中加锁有两种⽅式,独占模式和共享模式。
1.独占模式,不允许其他会话以任何⽅式共享锁定资源,当进⾏数据库数据修改时可以使⽤这种模式。
2.共享模式,允许在数据访问时,并发共同访问,但是当修改数据时上升为独占模式。
锁分为⾏级锁和表级锁,⾏级锁是锁定某些⾏记录,表级锁是锁定整张表。
1.⾏级锁。
insert update delete (隐式加⾏锁) select...for update(显⽰加⾏锁,共享模式) select * from emp where deptno=30 for update select * from A where id=2 for update skip locked update emp set ename='Joke' where empno=7499;在释放锁之前其他⽤户只能对进⾏数据查询,不能对数据进⾏insert、delete和update。
假如有其他⽤户要锁定同⼀资源:可以使⽤wait ⼦句对锁的等待时间控制如:在另⼀⽤户中:select * from emp where deptno=30 for update wait 2 (等待2秒如2秒钟还未释放资源,系统将会给出提⽰信息。
2.表级锁。
共享模式(in share mode) 共享更新模式(in share update mode) 排他锁模式锁定表的通⽤语法: lock table 表名 in ;1) 共享模式 不允许其他⽤户插⼊,更新和删除⾏,多个⽤户可以同时在同⼀表上设置共享锁,这样设置锁的多个⽤户都只能执⾏查询 lock table emp in share mode;2)共享更新模式(in share update mode) 允许多个⽤户同时锁定表的不同⾏, 允许其他⽤户进⾏DML(insert update delete select)操作 , 除了已锁定的⾏ 如: lock table emp in share update mode; select * from emp where deptno=30 for update //锁定的⾏其他⽤户不能delete ,update 部门30的雇员信息 其他⽤户可以查看锁定的⾏: select * from emp where deptno=303)排他锁模式(限制性强) 不允许其他⽤户插⼊,更新和删除⾏, 允许查看数据,但只有⼀个⽤户可以在表中放置排他锁 lock table emp in exclusive mode;解锁:(1)锁表查询的代码有以下的形式: select count(*) from v$locked_object; select * from v$locked_object;(2)查看哪个表被锁 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; (3)查看是哪个session引起的 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;(4)杀掉对应进程 执⾏命令:alter system kill session'1025,41'; 其中1025为sid,41为serial#.。
Oracle用户被锁的原因及解决办法

Oracle⽤户被锁的原因及解决办法在登陆时被告知test⽤户被锁1、⽤dba⾓⾊的⽤户登陆,进⾏解锁,先设置具体时间格式,以便查看具体时间SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';Session altered.2、查看具体的被锁时间SQL> select username,lock_date from dba_users where username='TEST';USERNAME LOCK_DATETEST 2009-03-10 08:51:033、解锁SQL> alter user test account unlock;User altered.4、查看是那个ip造成的test⽤户被锁查看$ORACLE_HOME/network/admin/log/listener.log⽇志10-MAR-2009 08:51:03 * (CONNECT_DATA=(SID=lhoms)(SERVER=DEDICATED)(CID=(PROGRAM=Oracle)(HOST=omstestdb)(USER=oraoms))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.69.1.11)(PORT=49434)) * establish * lhoms * 0 10-MAR-2009 08:51:03 * (CONNECT_DATA=(SID=lhoms)(SERVER=DEDICATED)(CID=(PROGRAM=oracle)(HOST=omstestdb)(USER=oraoms))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.69.1.11)(PORT=49435)) * establish * lhoms * 0这样可知是上⾯10.69.1.11的ip尝试多次失败登陆造成的被锁注:⼀般数据库默认是10次尝试失败后锁住⽤户1、查看FAILED_LOGIN_ATTEMPTS的值select * from dba_profiles2、修改为30次alter profile default limit FAILED_LOGIN_ATTEMPTS 30;3、修改为⽆限次(为安全起见,不建议使⽤)alter profile default limit FAILED_LOGIN_ATTEMPTS unlimited;以上所述是⼩编给⼤家介绍的Oracle⽤户被锁的原因及解决办法,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。
oracle锁原理

Oracle锁原理详解1. 概述在Oracle数据库中,锁是用于控制并发访问的一种机制。
当多个用户同时访问数据库时,为了保证数据的一致性和完整性,Oracle会对数据进行加锁,以防止其他用户对数据的修改。
本文将详细介绍Oracle锁的基本原理。
2. 锁的类型Oracle中的锁可以分为两种类型:共享锁(Shared Lock)和排他锁(Exclusive Lock)。
•共享锁:多个事务可以同时获取共享锁,并且可以并发读取数据,但不能修改数据。
共享锁用于保证数据的一致性,即多个事务可以同时读取相同的数据,但不能同时修改数据。
•排他锁:只有一个事务可以获取排他锁,并且其他事务不能同时获取共享锁或排他锁。
排他锁用于保证数据的完整性,即一个事务在修改数据时,其他事务不能同时读取或修改数据。
3. 锁的级别Oracle中的锁可以分为多个级别,包括表级锁、行级锁和字段级锁。
•表级锁:锁定整个表,阻止其他事务对表的修改。
表级锁对于大型表来说,可能会导致性能问题,因为它会阻塞其他事务的访问。
•行级锁:锁定表中的一行数据,其他事务可以并发读取其他行的数据。
行级锁可以更细粒度地控制并发访问,但可能会导致死锁问题。
•字段级锁:锁定表中的一个或多个字段,其他事务可以并发读取或修改其他字段的数据。
字段级锁可以进一步细化锁的粒度,但也可能导致死锁问题。
4. 锁的控制Oracle中的锁由数据库管理系统(DBMS)自动控制,用户无需手动操作。
当一个事务对数据进行修改时,DBMS会自动为该数据加上相应的锁,并在事务提交或回滚后释放锁。
锁的控制是通过锁定机制和并发控制机制实现的。
•锁定机制:当一个事务对数据进行修改时,DBMS会自动为该数据加上相应的锁。
锁定机制可以保证在并发访问时,每个事务都能正确地读取和修改数据。
•并发控制机制:当多个事务同时访问数据库时,DBMS会根据事务的隔离级别来控制并发访问。
并发控制机制可以避免脏读、不可重复读和幻读等问题。
oracle锁表原因和如何解锁分享

oracle锁表原因和如何解锁分享最近项⽬项⽬开始忙起来了,就不哔哔了,直接给你们看东西好了。
查锁表select a.OS_USER_NAME, c.owner, c.object_name, b.sid, b.serial#, logon_timefrom v$locked_object a, v$session b, dba_objects cwhere a.session_id = b.sidand a.object_id = c.object_idorder by b.logon_time;解锁ALTER SYSTEM KILL SESSION '129,77';查什么系统导致上的锁select spid, osuser, s.programfrom v$session s,v$process pwhere s.paddr=p.addr and s.sid=129查看什么语句导致锁表的select l.session_id sid,s.serial#,l.locked_mode,l.oracle_username,er#,l.os_user_name,s.machine,s.terminal,a.sql_text,a.actionfrom v$sqlarea a, v$session s, v$locked_object lwhere l.session_id = s.sidand s.prev_sql_addr = a.addressorder by sid, s.serial#;查看有⼏个表被锁select count(*) from v$locked_object;查表SPID129是通过查锁表查出来的SIDselect spid, oSUSEr, s.programfrom v$session s,v$process pwhere s.paddr=p.addr and s.sid=129当Kill不能解锁时,Ctrl+R CMD 输⼊下⾯这句,结束线程。
oracle 字段加密解密方法

(原创实用版3篇)编制人员:_______________审核人员:_______________审批人员:_______________编制单位:_______________编制时间:____年___月___日序言下面是本店铺为大家精心编写的3篇《oracle 字段加密解密方法》,供大家借鉴与参考。
下载后,可根据实际需要进行调整和使用,希望能够帮助到大家,谢射!(3篇)《oracle 字段加密解密方法》篇1Oracle 提供了 DBMS_CRYPTO 包来进行字段加密和解密操作。
在使用此包前,需要先创建一个密钥,可以使用 DES、AES 等算法进行加密。
以下是使用 AES 算法进行加密的步骤:1.创建一个密钥:```CREATE OR REPLACE SYSTEM GENERATED ALWAYS AS NEEDED CREDENTIALS DES_KEY;```2.使用密钥进行加密:```SELECT DBMS_CRYPTO.ENCRYPT(平原文本,DES_KEY) FROM 表名;```3.解密加密后的字段:```SELECT DBMS_CRYPTO.DECRYPT(加密后的字段,DES_KEY) FROM 表名;```其中,平原文本是需要加密的字符串,DES_KEY 是加密密钥。
在解密时,需要使用相同的密钥进行解密。
需要注意的是,加密和解密操作都需要使用 sys 用户进行操作,因为该用户拥有足够的权限来使用 DBMS_CRYPTO 包。
《oracle 字段加密解密方法》篇2Oracle 提供了 DBMS_CRYPTO 包来支持字段加密和解密操作。
在使用此包之前,需要先创建一个密钥,可以使用 DBMS_CRYPTO.GENERATE_KEY 函数生成一个随机密钥,也可以使用 DBMS_CRYPTO.HASH_KEY 函数将一个字符串作为输入生成密钥。
对于加密操作,可以使用 DBMS_CRYPTO.ENCRYPT 函数,将明文字符串和密钥作为输入,返回加密后的密文字符串。
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常见死锁发生的原因以及解决方法。
一、死锁发生的原因1.竞争资源:当多个进程同时请求相同的资源时,可能会导致死锁的发生。
例如,如果两个进程同时请求一个表的写锁,那么它们就会陷入死锁状态。
2.锁的顺序:当多个进程按照不同的顺序请求锁时,可能会导致死锁的发生。
例如,如果进程A先请求资源X,再请求资源Y,而进程B先请求资源Y,再请求资源X,那么它们就会陷入死锁状态。
3.锁的持有时间:当一个进程持有一个锁,并且在等待其他资源时继续保持该锁,可能会导致死锁的发生。
例如,如果进程A持有资源X的锁,并且在等待资源Y时继续保持该锁,而进程B持有资源Y的锁,并且在等待资源X时继续保持该锁,那么它们就会陷入死锁状态。
二、死锁的解决方法1. 死锁检测和解除:Oracle数据库提供了死锁检测和解除的机制。
当一个进程请求一个资源时,数据库会检查是否存在死锁。
如果存在死锁,数据库会选择一个进程进行回滚,解除死锁状态,并且通知其他进程重新尝试获取资源。
2.超时设置:为了避免死锁的发生,可以设置超时时间。
当一个进程请求一个资源时,如果在指定的超时时间内无法获取资源,那么就放弃该请求,并且释放已经持有的资源。
这样可以防止死锁的发生,但是会增加系统的开销。
3.锁的顺序:为了避免死锁的发生,可以规定所有进程按照相同的顺序请求锁。
例如,可以规定所有进程按照资源的名称进行排序,然后按照顺序请求锁。
这样可以避免死锁的发生,但是可能会影响系统的性能。
4.锁的粒度:为了避免死锁的发生,可以尽量减小锁的粒度。
例如,可以将一个大的锁分解成多个小的锁,这样可以减少锁的冲突,降低死锁的概率。
但是需要注意的是,锁的粒度过小可能会导致系统的性能下降。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracle中锁的产品和解锁文档修改记录版本号日期说明编写者审核者V1.0 20110822 初稿周伟明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;当一个事务在一个表持有行共享锁的时候,允许其他事务并行查询、插入、修改或者删除及再进行行锁,但禁止其他事务以排他方式进行操作该表。
Lock Table 表名 in Exclusive Mode;●行排他表锁(RX)行排他表锁(有时也叫SX)表示该事务对该资源有独占权利,通常是在修改记录时发生这种锁。
该锁在执行以下命令的时候自动获取:Insert Into 表名…;Update 表名…;Delete From 表名…;Lock Table 表名 In Row Exclusive Mode;当一个事务在一个表上持有行排他锁时,允许其他事务并行查询、插入、删除、修改或者锁同一个表的其他行,但禁止其他事务使用下列命令进行并发锁:Lock Table 表名 In Share Mode;Lock Table 表名 In Share Row Exclusive Mode;Lock Table 表名 In Exclusive Mode;●共享表锁(S)拥有共享表锁的事务允许其他事务查询该表,或用Select … For Update锁住指定的行,和取得他们自己的Share Table锁(Lock Table In Share Mode),但其他事务不能修改该表。
实现共享表锁使用如下命令:Lock Table 表名 In Share Table;但是禁止其他事务使用下列命令进行并发锁:Lock Table 表名 In Share Exclusive Mode;Lock Table 表名 In Row Exclusive Mode;Lock Table 表名 In Exclusive Mode;●共享行排他表锁(SRX)这种锁比共享锁具有更多限制,它只允许其他事务做查询,或用Select … For Update 锁指定的行,但不允许修改表。
实现共享行排他表锁使用如下命令:Lock Table 表名 In Share Row Exclusive Mode;一旦表使用了这种锁,下列锁均不可使用:Lock Table 表名 In Share Mode;Lock Table 表名 In Share Row Exclusive Mode;Lock Table 表名 In Exclusive Mode;●排他表锁(X)排他表锁是最严格的方式,一个表只允许一个排他表锁存在,Exclusive允许持有锁的事务对该表读取操作,其他事务只可以查询操作,插入、删除、修改等操作均不允许,也不允许取得任何形式的锁。
实现排他表锁使用如下命令:Lock Table 表名 In Exclusive Mode;1.1.2字典锁(DDL)模式DDL锁保证模式对象(如表)的定义,DDL操作将影响对象;一个DDL命令隐式地提交一个事务,当DDL事务需要时,由Oracle 自动获取字典锁,用户不能显式地请求DDL锁。
1.1.3内部锁模式内部用户保证Oracle内部结构,而这些内部结构是不能访问的,所以用户无需对他们深入了解。
1.1.4死锁死锁是多用户系统可能发生的一种现象,通常这种情况比较少,但是一般出现就比较致命。
当两个或者多个进程相互等待对方释放资源而没有一个进程可以继续的时候,就造成了死锁,具体如下:实例1:事务T1:Update fundreal aSet a.current_balane = a.current_balane + v_current_balaneWhere a.fund_account = ‘100000’;Update fundserialcounter aSet a.serial_counter_value = a.serial_counter_value + 1;Where a.serial_counter_no = 1;事务T2:Update fundserialcounter aSet a.serial_counter_value = a.serial_counter_value + 1;Where a.serial_counter_no = 1;Update fundreal aSet a.current_balane = a.current_balane + v_current_balaneWhere a.fund_account = ‘100000’;当T1事务在修改fundreal表记录的时候,T2事务在修改fundserialcounter表,而当T1事务在修改fundserialcounter表的时候,T2事务还没有释放,这时T2事务需要处理fundreal表,T1事务还没有释放,这样相互等待就出现了死锁。
实例2:事务T1:for cur_loop in (select a.* from fundreal a where a.fund_account >= ‘10000’) loopUpdate fundreal aSet a.current_balane = a.current_balane + v_current_balane Where a.fund_account = cur_loop.fund_accountAnd a.money_type = ‘0’;Update fundserialcounter aSet a.serial_counter_value = a.serial_counter_value + 1;Where a.serial_counter_no = 1And a.branch_no = cur_loop.branch_no;end loop;事务T2:Update fundreal aSet a.current_balane = a.current_balane + v_current_balaneWhere a.fund_account = ‘100001’And a.money_type = ‘0’;Update fundserialcounter aSet a.serial_counter_value = a.serial_counter_value + 1;Where a.serial_counter_no = 1And a.branch_no = 1;当T1事务在修改fundreal表修改账号10000的时候并且修改了表fundserialcounter 的branch_no字段为1的数据,T2事务在修改fundreal表修改账号100001的时候,而当T1事务在修改fundreal表账号100001的时候,T2事务还没有释放fundreal,这时T2事务需要处理fundserialcounter表,T1事务还没有释放fundserialcounter,这样相互等待就出现了死锁。
1.1.4.1死锁原理当PMON(程序监控)后台进程检查到死锁之后,就会自动回滚导致死锁的命令,会产生如下错误:ORA-00060: deadlock detected while waiting for resource.并通知PMON首先检查到的哪一个进程发生了死锁(这是不能预测的),接收到死锁信息的进程必须决定释放回滚所做的其他修改,这样将使得另外一个进程继续下去,或者采取其他措施,如要求数据库管理员找到导致死锁的另外一个进程并进行杀死。
例如:Alter System Kill Session ‘Sid,Serial#’;2Oracle锁的查询2.1 涉及系统对象2.1.1V$LOCK查看当前系统中所有锁定的情况,主要字段内容如下1.TYPE :类型说明AD ASM Disk AU LockAF Advisor FrameworkAG Analytic Workspace GenerationAK GES Deadlock TestAO MultiWriter Object AccessAS Service OperationsAT Alter TablespaceAW Analytic WorkspaceBR Backup/RestoreCF Controlfile TransactionCI Cross-Instance Call InvocationCL Label Security cacheCM ASM Instance EnqueueCT Block Change TrackingCU CursorDB DbsDriverDD ASM Local Disk GroupDF Datafile Online in RAC技术文档DG ASM Disk Group ModificationDI GES InternalDL Direct Loader Index CreationDM Database Mount/OpenDN Diskgroup number generatorDP LDAP ParameterDQ ASM RBAL doorbellDR Distributed RecoveryDS Database SuspendDT Default Temporary TablespaceDV Diana VersioningDX Distributed TransactionE Library Cache Lock 2FA ASM File Access LockFB Format BlockFC Disk Group Chunk MountFD Flashback DatabaseFG ACD Relocation Gate EnqueueFL Flashback database logFM File MappingFR Disk Group RecoveryFS File Set / Dictionary CheckFT Disk Group Redo GenerationFU DBFUSG Library Cache Pin 2HD ASM Disk HeaderHP Queue PageHQ Hash QueueHV Direct Loader High Water MarkHW Segment High Water MarkIA InternalID NIDIL Label SecurityIM Kti blr lockIR Instance RecoveryIS Instance StateIT In-Mem Temp Table Meta CreationIV Library Cache InvalidationIZ INSTANCE LOCKJD Job Queue DateJI Materialized ViewJQ Job QueueJS Job SchedulerKK Kick Instance to Switch LogsKM SchedulerKP Kupp Process StartupKT Scheduler PlanL Library Cache Lock 1MD Materialized View Log DDLMH AQ Notification Mail HostML AQ Notification Mail PortMN LogMinerMR Media RecoveryMS Materialized View Refresh LogMW MWIN Schedule技术文档N Library Cache Pin 1OC Outline CacheOL Outline NameOQ OLAPI HistoriesPD Property LockPE ParameterPF Password FilePG Global ParameterPH AQ Notification ProxyPI Remote PX Process Spawn StatusPL Transportable TablespacePM ASM PST SignallingPR Process StartupPS PX Process ReservationPT ASM Partnership and Status TablePV KSV slave startupPW Buffer Cache PreWarmQ Row CacheRB ASM Rollback RecoveryRF Data Guard BrokerRM GES Resource RemasteringRN Redo Log Nab ComputationRO Multiple Object ReuseRP Resilver / RepairRS Reclaimable SpaceRT Redo ThreadSB LogicalStandbySC System Change NumberSF AQ Notification SenderSH Active Session History FlushingSI Streams Table InstantiationSK Shrink SegmentSM SMON SerializationSQ Sequence CacheSR Synchronized ReplicationSS Sort SegmentST Space TransactionSU SaveUndo SegmentSV Sequence OrderingSW Suspend WritesTA Instance UndoTB SQL Tuning Base Existence CacheTC Tablespace CheckpointTD KTF map table enqueueTE KTF broadcastTF Temporary FileTL Log LockTM DMLTO Temp ObjectTQ Queue table enqueueTS Temporary SegmentTT TablespaceTW Cross-Instance TransactionTX TransactionUL User-defined技术文档UN User NameUS Undo SegmentWA AQ Notification WatermarkWF AWR FlushWL Being Written Redo LogWP AWR PurgeWS LogWriter StandbyXH AQ Notification No-ProxyXR Quiesce / Force LoggingXY Internal Test2.LMODE :类型说明1 NULL2 RS(Row Share)3 RX(Row Exclusive)4 S(Share Table)5 SRX(Share Row Exclusive)6 X(Exclusive)3.REQUEST :类型说明0 Success1 Timeout(The lock could not be obtainedwithin the specified number of seconds)2 Deadlock(In this case, an arbitrary sessionwill be rolled back)3 Parameter Error4 The session does not own the lockspecified by the lock ID or the lock handle.5 Invalid lock handle. The handle was notfound on the lock table.4.ID1:TX状态下,等待锁的对象ID,TM状态下,回滚号码的十进制。