Oracle包被锁定的原因分析及解决方案
- 格式:doc
- 大小:15.46 KB
- 文档页数:9
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死锁问题及解决办法死锁通常是2个及以上线程共同竞争同⼀资源⽽造成的⼀种互相等待的僵局。
我们看下图所⽰场景。
线程1执⾏的事务先更新资源1,然后更新资源2。
线程2涉及到的事务先更新资源2,然后更新资源1。
这种情况下,很容易出现你等我我等你,导致死锁。
我⽤Oracle数据库来模拟这种场景的死锁。
●service类如下PayAccountServiceMock类, up⽅法和up2⽅法,这2个⽅法使⽤了spring事务,逻辑是根据账户id来更新两条账户的⾦额。
不过,两个⽅法更新两条账户记录的顺序是相反的。
我们⽤后⾯的testcase很容易就能模拟出Oracle死锁。
package com.xxx.accounting;import org.springframework.transaction.annotation.Transactional;@Service@Slf4jpublic class PayAccountServiceMock {@Autowiredprivate TAccTransService tAccTransService;@Transactionalpublic void up() throws InterruptedException {tAccTransService.updateBalance("89900000426016346075");Thread.sleep(RandomUtils.nextInt(100, 300));select("89900000426016346075");tAccTransService.updateBalance("PF00060");}@Transactionalpublic void up2(TAccTrans at4) throws InterruptedException {tAccTransService.updateBalance("PF00060");Thread.sleep(550);tAccTransService.updateBalance("89900000426016346075");}@Transactionalpublic void select(String id) {tAccTransService.selectByPrimaryKey(id);try {Thread.sleep(1100);} catch (InterruptedException e) {e.printStackTrace();}}}View Code●testcase类如下Junit测试类,使⽤倒计数门栓(CountDownLatch,就是JUC包下倒计时门栓,个⼈觉得⽤“倒计数门栓”感觉更合适~)来保证多线程同时执⾏,达到并⾏处理的效果。
解决Oracle死锁问题,及产⽣的原因
⽂章来源:
最近⽼是发现应该执⾏操作数据库的代码时发现执⾏不了,查了⼀下发现是数据库表锁死的原因,
,纠其原因,发现有些同事操作数据库时⽼是喜欢⽤select * from XXX for update
去操作数据库,有的操作了⼜没有COMMIT 所以导致数据库锁死,笔都建议⼤家不⽤,如果要⽤for update 之后请你记得提交解决死锁的⽅法
第⼀步:找到数据库中被锁死的表
select object_id,session_id,locked_mode from v$locked_object;
第⼆步:找到表的SID SERIAL#
select ername,t2.sid,t2.serial#,t2.logon_time
from v locked o bjectt1,v session t2
where t1.session_id=t2.sid order by t2.logon_time;
第三步:强杀锁死的表
alter system kill session 'sid,serial#';
另:Oracle9I以后的版本有⾃动处理锁死表的能⼒!
Processing math: 100%。
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中锁的产品和解锁文档修改记录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锁表原因和如何解锁分享最近项⽬项⽬开始忙起来了,就不哔哔了,直接给你们看东西好了。
查锁表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包被锁定的原因分析及解决方案在数据库的开发过程中,经常碰到包、存储过程、函数无法编译或编译时会导致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常见死锁发生的原因以及解决方法。
一、死锁发生的原因1.竞争资源:当多个进程同时请求相同的资源时,可能会导致死锁的发生。
例如,如果两个进程同时请求一个表的写锁,那么它们就会陷入死锁状态。
2.锁的顺序:当多个进程按照不同的顺序请求锁时,可能会导致死锁的发生。
例如,如果进程A先请求资源X,再请求资源Y,而进程B先请求资源Y,再请求资源X,那么它们就会陷入死锁状态。
3.锁的持有时间:当一个进程持有一个锁,并且在等待其他资源时继续保持该锁,可能会导致死锁的发生。
例如,如果进程A持有资源X的锁,并且在等待资源Y时继续保持该锁,而进程B持有资源Y的锁,并且在等待资源X时继续保持该锁,那么它们就会陷入死锁状态。
二、死锁的解决方法1. 死锁检测和解除:Oracle数据库提供了死锁检测和解除的机制。
当一个进程请求一个资源时,数据库会检查是否存在死锁。
如果存在死锁,数据库会选择一个进程进行回滚,解除死锁状态,并且通知其他进程重新尝试获取资源。
2.超时设置:为了避免死锁的发生,可以设置超时时间。
当一个进程请求一个资源时,如果在指定的超时时间内无法获取资源,那么就放弃该请求,并且释放已经持有的资源。
这样可以防止死锁的发生,但是会增加系统的开销。
3.锁的顺序:为了避免死锁的发生,可以规定所有进程按照相同的顺序请求锁。
例如,可以规定所有进程按照资源的名称进行排序,然后按照顺序请求锁。
这样可以避免死锁的发生,但是可能会影响系统的性能。
4.锁的粒度:为了避免死锁的发生,可以尽量减小锁的粒度。
例如,可以将一个大的锁分解成多个小的锁,这样可以减少锁的冲突,降低死锁的概率。
但是需要注意的是,锁的粒度过小可能会导致系统的性能下降。
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的死锁问题实际上很少见,如果发⽣,基本上都是不正确的程序设计造成的,经过调整后,基本上都会避免死锁的发⽣。
标题:Oracle 解除账户锁定规则一、背景介绍Oracle数据库作为一种重要的关系型数据库管理系统,广泛应用于各行各业的信息管理和数据存储中。
在使用Oracle数据库的过程中,经常会碰到账户被锁定的情况,这给数据库管理人员带来了一定的困扰。
为了解决这一问题,Oracle提供了一定的解除账户锁定规则。
二、账户锁定的原因1. 输入错误超过一定次数2. 管理员手动锁定账户3. 其他未知原因导致的账户锁定三、账户锁定的解除规则1. 通过重置密码解除锁定当账户因为密码输入错误次数过多被锁定时,可以通过重置密码解除锁定。
具体操作步骤如下:(1)使用管理员账户登入Oracle数据库;(2)执行ALTER USER username ACCOUNT UNLOCK语句,将被锁定的账户解锁;(3)执行ALTER USER username IDENTIFIED BY new_password语句,重置该账户的密码。
2. 等待一定时间自动解锁当账户被锁定时,可以选择等待一定时间让系统自动解锁账户。
Oracle默认的自动解锁时间为30分钟,当超过这个时间后,系统会自动解锁账户。
3. 通过SYS用户解锁在特殊情况下,可以使用SYS用户来解锁被锁定的账户。
操作步骤如下:(1)使用SYS用户登入Oracle数据库;(2)执行ALTER USER username ACCOUNT UNLOCK语句,将被锁定的账户解锁。
四、账户锁定规则的设置和管理1. 设置账户锁定策略为了保障数据库的安全性,可以设置账户锁定策略,限制密码错误次数并设置账户锁定时间。
可以通过以下SQL语句设置账户锁定策略:ALTER PROFILE profile_name LIMIT F本人LED_LOGIN_ATTEMPTS n;ALTER PROFILE profile_name LIMIT PASSWORD_LOCK_TIME t;2. 监控账户锁定情况数据库管理员应当定期查看和监控数据库中账户的锁定情况,及时发现并处理异常情况,保障数据库的正常运行。
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中DDL锁分为:Exclusive DDL Locks(排他的DDL)、Share DDL Locks(共享DDL锁)、Breakable Parse Locks(可被打破的解析锁)几类。
篇幅所限,这里就不再详细介绍了。
根据这个例子推理一下,当我们试图编译、修改存储过程、函数、包等对数据对象的时候,如果别人也正在编译或修改他们时就会产生锁等待;或者我们在编译某个存储过程的时候,如果它所引用的数据库对象正在被修改应该也会产生锁等待。
这种假设有兴趣的兄弟可以测试下,不过比较困难。
解决方案碰到这种问题,如果知道是被谁锁定了(可以查出来的),可以让对方尽快把锁释放掉;实在查不出来只能手工将这个锁杀掉了。
步骤如下:1、首先查出哪些进程锁住了这个对象,语句如下:Select b.SID,b.SERIAL#Fromdba_ddl_locks a, v$session bWhere a.session_id= b.SIDAnd ='FUN_CORE_SERVICECALL';2、执行如下语句杀进程:alter system kill session'sid,serial#'3、执行了以上的语句后,有的时候不一定能够将进程杀掉。
这个时候就需要连到数据库服务器上杀掉服务器端的进程了,查询语句:Select spid, osuser, s.programFromv$session s, v$process pWhere s.paddr= p.addrAnd s.sid =(上面查出来的SID)4、在服务器上执行如下语句:#kill -9 spid(UNIX平台)orakill sid thread(Windows平台SID是Oracle的实例名,thread是上面查出来的SID)5、执行完4步以后基本上就可以杀掉这些锁死的进程了,不放心的话可以再执行第一步确认下。
本文只能是说对这个问题做了初步分析,产生此问题的原因及解决方案涉及到很多Oracle的基本知识。
如:DML语句,DDL语句;Oracle锁的机制;v$session 与v$process之间关系等。
有兴趣的兄弟可以更加深入的研究,欢迎跟我交流!死锁是数据库经常发生的问题,数据库一般不会无缘无故产生死锁,死锁通常都是由于我们应用程序的设计本身造成的。
产生死锁时,如何解决呢,下面是常规的解决办法:1)执行下面SQL,先查看哪些表被锁住了:selectb.owner,b.object_name,a.session_id,a.locked_modefrom v$locked_object a,dba_objects bwhere b.object_id = a.object_id;2)查处引起死锁的会话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;这里会列出SID3)查出SID和SERIAL#:查V$SESSION视图:SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='刚才查到的SID';这一步将得到PADDR 4)查V$PROCESS视图:SELECT SPID FROM V$PROCESS WHERE ADDR='刚才查到的PADDR';这一步得到SPID 5)杀死进程(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> selectusername,lockwait,status,machine,program fromv$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_value in(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> SELECTername,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';再次执行存储过程,错误没有了。
语句执行成功!。