Oracle常见死锁发生的原因以及解决方法
如何处理数据库中的死锁问题(五)
在开发和运维数据库系统的过程中,经常会遇到死锁问题。
死锁是指两个或多个进程在执行过程中,互相请求对方所持有的资源,同时又拒绝释放自己持有的资源,导致彼此都无法继续执行的情况。
如何处理数据库中的死锁问题成为数据库管理员和开发人员必须重视的一个方面。
1. 死锁问题的原因分析死锁问题主要是由于并发访问数据库中的共享资源时,对资源先后次序的控制不当引起的。
当多个进程需要同时访问同一个资源时,通过资源锁机制来保证数据的一致性和完整性。
然而,如果没有良好的资源访问控制策略,就容易导致死锁问题的发生。
2. 死锁问题的识别为了解决死锁问题,首先需要能够识别出死锁的存在。
数据库系统通常会提供一些工具和机制来帮助识别死锁,如死锁检测器。
死锁检测器可以追踪资源的分配和请求情况,以及进程的等待关系,并根据这些信息判断是否存在死锁。
3. 死锁问题的解决方法一旦识别出死锁问题的存在,就需要采取相应的解决方法来消除死锁。
以下是一些常用的死锁解决方法:a. 死锁超时机制死锁超时机制是一种简单但有效的解决方法。
当进程在一定时间内无法获得所需资源时,可以通过设置超时时间来主动放弃并重新尝试获取资源,以避免长时间的无谓等待。
b. 死锁检测与恢复死锁检测与恢复是一种较为复杂但比较全面的解决方法。
通过定期或实时地检测死锁的存在,然后采取相应的恢复策略。
常见的恢复策略有终止进程、回滚事务等。
c. 死锁预防死锁预防是一种在设计数据库系统时就考虑和解决死锁问题的方法。
通过合理的资源分配策略、避免不必要的资源竞争等手段来预防死锁的发生。
d. 死锁避免死锁避免是基于资源请求的动态分配的原则,根据当前系统状态和资源请求情况,通过预测资源请求的未来走向来避免潜在的死锁。
这需要对系统状态和资源请求进行动态调整和优化。
4. 其他注意事项处理数据库中的死锁问题还需要注意以下几个方面:a. 优化数据库设计合理的数据库设计在很大程度上可以减少死锁问题的发生。
通过合理的表和索引设计,可以降低并发事务对同一资源的竞争。
oracle死锁一例
死锁一例:应用程序报错图片:客户应用基于odbc与sybase数据库连接,数据库错误信息通过odbc传回。
错误信息:操作发生死锁,请重试。
死锁的产生原因:SQL server中的死锁:注:4个update语句的执行顺序按图中位置自上而下图中左边的会话得以执行,右边会话作为死锁的牺牲者回滚。
Oracle中的死锁:注:4个update语句的执行顺序按图中位置自上而下图中左边会话中断(此时不回滚也不提交,等待用户决定),右边会话阻塞,等待左边会话释放a表上的锁。
如图:死锁解决方法:修改应用!参考以下方法。
1、将死锁减至最少虽然不能完全避免死锁,但可以使死锁的数量减至最少。
将死锁减至最少可以增加事务的吞吐量并减少系统开销,因为只有很少的事务:∙回滚,而回滚会取消事务执行的所有工作。
∙由于死锁时回滚而由应用程序重新提交。
下列方法有助于最大限度地降低死锁:∙按同一顺序访问对象。
∙避免事务中的用户交互。
∙保持事务简短并在一个批处理中。
∙使用低隔离级别。
∙使用绑定连接。
2、按同一顺序访问对象如果所有并发事务按同一顺序访问对象,则发生死锁的可能性会降低。
例如,如果两个并发事务获得Supplier表上的锁,然后获得Part表上的锁,则在其中一个事务完成之前,另一个事务被阻塞在Supplier表上。
第一个事务提交或回滚后,第二个事务继续进行。
不发生死锁。
将存储过程用于所有的数据修改可以标准化访问对象的顺序。
3、避免事务中的用户交互避免编写包含用户交互的事务,因为运行没有用户交互的批处理的速度要远远快于用户手动响应查询的速度,例如答复应用程序请求参数的提示。
例如,如果事务正在等待用户输入,而用户去吃午餐了或者甚至回家过周末了,则用户将此事务挂起使之不能完成。
这样将降低系统的吞吐量,因为事务持有的任何锁只有在事务提交或回滚时才会释放。
即使不出现死锁的情况,访问同一资源的其它事务也会被阻塞,等待该事务完成。
4、保持事务简短并在一个批处理中在同一数据库中并发执行多个需要长时间运行的事务时通常发生死锁。
ORACLE 数据库故障解决方案
ORACLE 数据库故障解决方案一、引言在使用ORACLE数据库的过程中,难免会遇到各种故障,这些故障可能导致数据库无法正常运行,影响业务的连续性和数据的完整性。
因此,本文将介绍一些常见的ORACLE数据库故障,并提供相应的解决方案,以帮助管理员和开发人员快速恢复数据库运行。
二、故障类型及解决方案1. 数据库无法启动故障现象:尝试启动数据库时,遇到错误提示,无法成功启动。
解决方案:1) 检查数据库实例是否正常关闭,如果没有正常关闭,使用SHUTDOWN命令关闭数据库实例。
2) 检查数据库参数文件是否正确配置,确保参数文件路径正确,参数设置正确。
3) 检查数据库控制文件是否损坏,如果损坏,可以尝试恢复备份的控制文件。
4) 检查数据库日志文件是否损坏,如果损坏,可以尝试恢复备份的日志文件。
5) 检查数据库文件是否损坏,如果损坏,可以尝试恢复备份的数据文件。
2. 数据库性能下降故障现象:数据库查询响应时间延长,业务处理变慢。
解决方案:1) 分析数据库性能指标,如CPU利用率、内存利用率、磁盘IO等,找出性能瓶颈。
2) 优化SQL语句,如添加索引、重写查询语句等,提高查询效率。
3) 调整数据库参数,如增加SGA大小、调整PGA大小等,优化内存使用。
4) 分析数据库锁等待情况,解决锁冲突问题,提高并发处理能力。
5) 定期收集数据库统计信息,重新生成优化器统计信息,提高查询计划的准确性。
3. 数据库备份恢复故障现象:数据库数据丢失或损坏,需要进行数据恢复。
解决方案:1) 检查数据库备份情况,如果有可用的备份,可以尝试进行恢复操作。
2) 使用RMAN工具进行数据库备份和恢复操作,可以选择完全恢复或部分恢复。
3) 如果没有备份,可以尝试使用闪回技术进行数据恢复,还原到历史状态。
4) 如果数据文件损坏,可以尝试使用数据文件的备份进行恢复,或者使用RMAN进行数据文件的恢复。
5) 恢复完成后,进行数据一致性检查,确保数据库的完整性。
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包下倒计时门栓,个⼈觉得⽤“倒计数门栓”感觉更合适~)来保证多线程同时执⾏,达到并⾏处理的效果。
数据库死锁的检测与解决技巧
数据库死锁的检测与解决技巧数据库死锁是在多用户并发访问数据库时可能发生的一种情况,它会导致数据库无法继续正常执行操作。
在日常的数据库管理中,必须及时发现和解决死锁问题,以确保数据库的稳定性和可用性。
本文将介绍数据库死锁的检测与解决技巧。
一、死锁的定义与原因1. 死锁的定义:死锁是指两个或多个事务互相等待对方所持有的资源,而导致它们在无外力介入的情况下都无法继续执行的状态。
2. 死锁的原因:死锁通常发生在多个事务同时在数据库中申请资源时。
以下为常见的死锁原因:(1) 彼此互斥的资源:多个事务需要使用彼此互斥的资源。
(2) 事务保持资源并等待:一个事务保持资源并等待其他事务所持有的资源。
(3) 循环等待:多个事务形成一个闭环,每个事务等待下一个事务所持有的资源。
二、死锁的检测技巧1. 手动查询:可以通过查询系统视图或工具来检测是否存在死锁情况。
例如,在MySQL中,可以通过执行"show engine innodb status"命令来获取相关信息。
2. 使用系统工具:大多数数据库管理系统都提供了相关的工具来检测和解决死锁问题。
例如,在Oracle中,可以使用AWR报告来识别死锁情况。
3. 使用第三方工具:如果数据库管理系统的自带工具无法满足需求,可以考虑使用第三方工具来进行死锁检测。
一些常用的第三方工具包括Percona Toolkit和pt-deadlock-logger等。
三、死锁的解决技巧1. 重构数据库设计:死锁问题可能是由于数据库设计不合理导致的。
通过对数据库模式、索引和查询进行优化,可以减少死锁的发生概率,从而提高数据库的性能和可用性。
2. 事务隔离级别的选择:选择合适的事务隔离级别对于降低死锁的风险是至关重要的。
较高的隔离级别会导致更多的锁冲突和死锁发生机会,而较低的隔离级别可能影响数据的一致性和并发性。
需要在性能和数据一致性之间做出权衡选择。
3. 降低事务的持有时间:较长时间的事务可能会增加死锁的风险。
解决Oracle死锁问题,及产生的原因
解决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数据库死锁
解决Oracle数据库死锁解决Oracle数据库死锁2011年01月12日星期三08:35 P.M.解决Oracle数据库死锁介绍本文我们尝试总结在多个用户并发情况下,如何识别和解决删除操作期间发生的死锁问题,在开始之前,我们先简单描述一下什么是死锁以及什么东西会导致死锁。
死锁在任何数据库中发生死锁都是不愉快的,即使是在一个特殊的情况下发生也是如此,它们会减小应用程序的接受程度(ACCEPTANCE),因此避免并正确解释死锁是非常重要的。
当两个或更多用户相互等待锁定的数据时就会发生死锁,发生死锁时,这些用户被卡住不能继续处理业务,Oracle自动检测死锁并解决它们(通过回滚一个包含在死锁中的语句实现),释放掉该语句锁住的数据,回滚的会话将会遇到Oracle错误"ORA-00060:等待资源时检测到死锁"。
是什么导致了死锁?明确地锁定表是为了保证读/写一致性,未建立索引的外键约束,在相同顺序下表不会锁住,没有为数据段分配足够的存储参数(主要是指INITTRANS,MAXTRANS和PCTFREE参数)很容易引发突发锁和死锁,原因是多种多样的,需要重新逐步审查。
识别死锁当Oracle数据库检测到死锁时(Oracle错误消息:ORA-00060),相应的消息就写入到警告日志文件中(alert.log),另外还会在USER_DUMP_DEST目录下创建一个跟踪文件,分析警告日志文件和跟踪文件是非常耗时的。
下面是一个警告日志文件示例:Mon Aug 07 09:14:42 2007 ORA-000060:Deadlock detected.Moreinfo in file e:\oracle\admin\GEDEON\udump\ORA01784.TRC.下面是从跟踪文件中节选出来的片段,从其中我们可以看出是哪个语句创造了死锁,相关的语句和被锁定的资源已经标记为粗体。
/users/ora00/log/odn_ora_ 1097872.trc Oracle9i Enterprise Edition Release 9.2.0.8.0-64bit Production With the Partitioning,OLAP and Oracle Data Mining options JServer Release 9.2.0.8.0-Production ORACLE_HOME=/soft/ora920 System name:AIX Node name:beaid8 Release:2 Version:5 Machine:00C95B0E4C00 Instance name:ODN Redo thread mounted by this instance:1 Oracle process number:17 Unix process pid:1097872,image:oracle@beaid8(TNS V1-V3)*2007-06-04 14:41:04.080*SESSION ID:(10.6351)2007-06-04 14:41:04.079 DEADLOCK DETECTED(ORA-00060)The following deadlock is not an ORACLE error.It is adeadlock due to user error in the design of an application orfrom issuing incorrect ad-hoc SQL.The following information may aidin determining the deadlock:Deadlock graph:---Blocker(s)-----Waiter(s)---Resource Name process session holds waits process session holds waits TM-00001720-00000000 17 10 SX 16 18 SX SSX TM-0000173a-00000000 16 18 SX 17 10 SX SSX session 10:DID 0001-0011-00000002session 18:DID 0001-0010-00000022 session 18:DID 0001-0010-00000022session 10:DID 0001-0011-00000002 Rows waited on:Session 18:obj-rowid=00001727-AAABcnAAJAAAAAAAAA(dictionary objn-5927,file-9,block-0,slot-0)Session 10:obj-rowid=00001727-AAABcnAAJAAAAAAAAA(dictionary objn-5927,file-9,block-0,slot-0)Information on the OTHER waiting sessions:Session 18:pid=16 serial=2370 audsid=18387 user:21/ODN O/S info:user:mwpodn00,term:unknown,ospid:,machine:beaida program:JDBC Thin Client application name:JDBC Thin Client,hash value=0 Current SQL Statement:DELETE FROM ODNQTEX WHERE EX_ID=:B1 End of information on OTHER waiting sessions.Current SQL statement for this session:DELETE FROM ODNQTFN WHERE FN_ID_EXIGENCE_EX=:B1---PL/SQL Call Stack---object line object handle number name 7000000135 f7fd8 34 procedure ODN.ODNQPDR 700000013 5f89f0 16 procedure ODN.ODNQPZB我们可以使用企业管理器来决定保留所有的锁还是释放掉它们,为了便于说明,我们打开2个sqlplus实例会话(在此期间同时发生了死锁)来一起调式,当每个语句执行完毕后,我们看到锁仍然保留下来了,它可以帮助我们识别出是哪个资源引起的死锁。
数据库死锁的产生与解决方法
数据库死锁的产生与解决方法数据库作为现代信息系统的核心组成部分之一,承担着存储和管理大量数据的重要任务。
然而,在多用户并发访问数据库时,死锁问题可能会导致系统性能下降甚至崩溃。
本文将探讨数据库死锁的产生原因,以及常用的解决方法。
一、死锁的产生原因1. 互斥访问资源:死锁的产生是因为多个并发事务同时竞争访问同一资源,每个事务都要求独占资源,但资源无法同时满足所有请求,导致事务之间发生资源竞争。
2. 内存不足:当系统内存不足时,数据库管理系统可能会将一些数据和操作转移到虚拟内存中。
如果产生死锁并且没有充足的物理内存来满足事务需求,那么死锁就会发生。
3. 事务持有和等待:当一个事务获取一个资源时,它可能会继续请求其他资源,并在等待其他资源的同时持有已获取的资源。
如果其他事务需要这些已获取的资源,则会产生死锁。
4. 循环等待:多个事务形成环形等待资源的关系,每个事务都在等待下一个事务所持有的资源,导致死锁的产生。
二、死锁解决方法1. 死锁检测与恢复:死锁检测算法可以周期性地扫描系统,定期检查是否存在死锁。
一旦检测到死锁,可以使用死锁恢复算法将死锁事务进行回滚,释放资源,解除死锁状态。
2. 死锁预防:死锁预防方法旨在通过改变系统的策略和规则,防止死锁的发生。
常见的预防方法包括:- 破坏互斥条件:通过将资源设置为可共享而不是互斥性的,可以防止死锁的发生。
- 破坏占有和等待条件:要求一个事务在执行之前获取所有需要的资源,而不是持有部分资源后再去请求其他资源。
- 破坏不可抢占条件:允许系统抢占一些资源,以便在发生死锁时能够打破死锁链。
- 破坏循环等待条件:通过强制事务按照某种统一顺序来请求资源,避免循环等待。
3. 死锁避免:死锁避免方法在事务执行之前对事务进行检测,并根据预测的执行路径来避免潜在的死锁情况。
该方法需要提前获得事务的请求资源信息,以便进行检测和判断是否应该阻止某个事务。
避免死锁的常用算法包括银行家算法和资源分配图算法。
ORACLE 数据库故障解决方案
ORACLE 数据库故障解决方案引言概述:ORACLE 数据库是目前企业常用的一种数据库管理系统,但在使用过程中难免会遇到各种故障。
本文将介绍一些常见的 ORACLE 数据库故障,并提供相应的解决方案,匡助读者更好地应对数据库故障。
一、数据库连接问题1.1 连接超时:当数据库连接超时时,可以通过增加连接超时时间的方式解决。
在 ORACLE 数据库中,可以通过修改 sqlnet.ora 文件中的SQLNET.INBOUND_CONNECT_TIMEOUT 参数来设置连接超时时间。
1.2 连接被拒绝:如果数据库连接被拒绝,可能是由于数据库实例未启动、监听器未启动或者网络故障等原因导致。
解决方案包括启动数据库实例、启动监听器以及检查网络连接是否正常。
1.3 连接池问题:当数据库连接池达到最大连接数时,新的连接请求会被拒绝。
解决方案包括增加连接池的最大连接数、释放闲置连接以及优化数据库连接的使用。
二、数据丢失问题2.1 意外删除数据:当数据被意外删除时,可以通过数据库备份和恢复的方式解决。
可以使用 RMAN 工具进行数据库备份,并在需要时使用备份进行恢复操作。
2.2 数据库文件损坏:当数据库文件损坏时,可以使用 RMAN 工具进行数据库文件的修复。
RMAN 提供了诊断和修复数据库文件的功能,可以匡助解决数据库文件损坏的问题。
2.3 数据库坏块:当数据库浮现坏块时,可以使用 RMAN 工具进行坏块的修复。
RMAN 提供了坏块检测和修复的功能,可以匡助解决数据库坏块问题。
三、性能问题3.1 慢查询:当数据库查询变慢时,可以通过优化查询语句、创建索引、增加硬件资源等方式解决。
可以使用 Explain Plan 工具来分析查询语句的执行计划,找出慢查询的原因,并进行相应的优化。
3.2 死锁:当数据库浮现死锁时,可以通过锁等待超时、死锁检测和解锁等方式解决。
可以使用 V$LOCK 和 V$SESSION 视图来查看当前的锁信息,并根据情况进行相应的解锁操作。
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.锁的粒度:为了避免死锁的发生,可以尽量减小锁的粒度。
例如,可以将一个大的锁分解成多个小的锁,这样可以减少锁的冲突,降低死锁的概率。
但是需要注意的是,锁的粒度过小可能会导致系统的性能下降。
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的死锁问题实际上很少见,如果发⽣,基本上都是不正确的程序设计造成的,经过调整后,基本上都会避免死锁的发⽣。
Oracle常见死锁发生的原因以及解决方法
Oracle常见死锁发生的原因以及解决方法Oracle常见死锁发生的原因以及解决办法一,删除和更新之间引起的死锁造成死锁的原因就是多个线程或进程对同一个资源的争抢或相互依赖。
这里列举一个对同一个资源的争抢造成死锁的实例。
Oracle 10g, PL/SQL version 9.2CREATE TABLE testLock( ID NUMBER,test VARCHAR(100) )COMMITINSERT INTO testLock VALUES(1,'test1');INSERT INTO testLock VALUES(2,'test2');COMMIT;SELECT * FROM testLock1. ID TEST2.---------- ----------------------------------3. 1 test14. 2 test2死锁现象的重现:1)在sql 窗口执行:SELECT * FROM testLock FOR UPDATE; -- 加行级锁并对内容进行修改,不要提交2)另开一个command窗口,执行:delete from testLock WHERE ID=1;此时发生死锁(注意此时要另开一个窗口,不然会提示:POST THE CHANGE RECORD TO THE DATABASE. 点yes 后强制commit):3)死锁查看:1.SQL> select ername,l.object_id, l.session_id,s.serial#, s.lockwait,s.status,s.machine,s.program from v$session s,v$locked_object l where s.sid = l.session_id;</p><p>USER NAME SESSION_ID SERIAL# LOCKWAIT STATUS MACHINE PROGRAM2.---------- ---------- ---------- -------- -------- ---------------------- ------------3.SYS 146 104 INACTIVE WORKGROUP\J-THINK PLSQLDev.exe4.SYS 144 145 20834474 ACTIVE WORKGROUP\J-THINK PLSQLDev.exe字段说明:Username:死锁语句所用的数据库用户;SID: session identifier,session 标示符,session 是通信双方从开始通信到通信结束期间的一个上下文。
数据库死锁的处理方法与预防措施
数据库死锁的处理方法与预防措施在进行高并发数据库操作时,可能会出现死锁的情况。
死锁是指两个或多个事务互相等待对方释放资源,导致操作无法继续进行的情况。
数据库死锁的出现会导致系统性能下降甚至崩溃,因此正确处理和预防死锁问题是非常重要的。
一、死锁的原因1. 争夺资源:多个事务同时竞争相同的资源,例如:表、行、页等。
2. 无序请求资源:事务对资源的请求无序,即按照不同的顺序进行,会增加产生死锁的可能性。
3. 循环等待:多个事务之间循环依赖对方所需的资源。
二、死锁的处理方法1. 超时处理:对于等待资源的事务,可以设置超时时间,超过一定时间仍未能获取到资源的事务,可以进行回滚处理,释放已经占用的资源。
2. 回滚处理:当数据库检测到死锁情况时,可以选择其中一个事务进行回滚,在该事务释放资源后,其他事务可以顺利进行。
3. 终止进程:数据库可以针对产生死锁的进程进行终止,释放其所占用的资源。
三、死锁的预防措施1. 合理规划事务操作顺序:对于数据库中要同时操作多个资源的事务,可以尽量按照相同的顺序请求资源,避免出现循环依赖。
2. 限制事务的最大并发数:通过设置数据库的最大并发事务数,限制同时进行的事务数量,可以减少死锁的概率。
但是要注意设置过低可能会影响系统的性能。
3. 尽量缩短事务的执行时间:长时间运行的事务增加了死锁的可能性,应该尽量将事务的执行时间缩短,减少锁定资源的时间。
4. 减少长事务的产生:长事务对锁资源的占用时间长,容易引发死锁。
通过合理设计事务的实现逻辑,将长事务拆分成多个短事务,可以减少死锁的风险。
5. 使用合适的隔离级别:数据库提供了不同的隔离级别,不同的隔离级别对事务的锁定行为有不同的规定。
在选择隔离级别时,可以根据具体业务需求来选择合适的级别。
6. 优化查询和索引设计:避免在事务过程中进行过多的查询和操作。
通过优化查询语句和相应的索引设计,可以减少锁定资源的数量和时间。
综上所述,处理和预防数据库死锁的方法是非常关键的。
oracle死锁原因分析
oracle死锁原因分析死锁的原因1。
模拟死锁1。
1。
主表-- Create tablecreate table WDZ1(WDZ1ID NUMBER not null,MEMO VARCHAR2(20));alter table WDZ1add constraint XXXXXX primary key (WDZ1ID);1。
2。
从表(没有外健的索引)-- Create tablecreate table WDZ2(WDZ2ID NUMBER not null,WDZ1ID NUMBER,MEMO VARCHAR2(20));-- Create/Recreate primary, unique and foreign key constraints alter table WDZ2add constraint XXXXX primary key (WDZ2ID);alter table WDZ2add constraint XXX foreign key (WDZ1ID)references WDZ1 (WDZ1ID);1。
3。
插入数据表到住表begininsert into wdz1 values (1,'aa');insert into wdz1 values(2,'aa2');insert into wdz1 values (3,'aa3');insert into wdz2 values(10,3,'wdz3--1');commit;end;1。
4。
在一个数据库seeesion里面插入数到从表,但是不提交事务beginupdate wdz2 set memo='update wdz2 momo'where wdz2id=10;insert into wdz2 values(20,2,'wdz2--1');end;对从表进行插入/修改记录,施加的锁也就是行级锁1。
死锁问题及其解决方法
死锁问题及其解决方法一、死锁的介绍死锁(Deadlocks)通常发生在两个或多个进程(sessions)对被彼此锁住的资源发出请求的情况下。
其最常见的锁的类型为:行级锁(row-level locks)和块级锁(block-level locks)。
ORACLE会自动侦察到死锁情况,并通过回滚其中一个造成死锁的语句,从而释放其中一个锁来解决它,如上图中的C时间所示。
需要说明的,如果一个事务中的某个语句造成死锁现象,回滚的只是这个语句而不是整个事务。
二、行级死锁及其解决方法行级锁的发生如下图所示,在A时间,Transacrion1和Transction2分别锁住了它们要update的一行数据,没有任何问题。
但每个Transaction都没有终止。
接下来在B时间,它们又试图update当前正被对方Transaction锁住的行,因此双方都无法获得资源,此时就出现了死锁。
之所以称之为死锁,是因为无论每个Transaction等待多久,这种锁都不会被释放。
行级锁的死锁一般是由于应用逻辑设计的问题造成的,其解决方法是通过分析trace文件定位出造成死锁的SQL语句、被互相锁住资源的对象及其记录等信息,提供给应用开发人员进行分析,并修改特定或一系列表的更新(update)顺序。
以下举例说明出现行级死锁时如何定位问题所在。
1.环境搭建create table b (b number);insert into b values(1);insert into b values(2);commit;session1: update b set b=21 where b=2;session2: update b set b=11 where b=1;session1: update b set b=12 where b=1;session2: update b set b=22 where b=2;此时出现死锁现象。
Oracle表中一行记录被锁(行锁,表锁,死锁)
Oracle表中⼀⾏记录被锁(⾏锁,表锁,死锁)表现形式:可以向表⾥⾯save新数据,但是⽆法跟新某⼀条数据,update的时候就⼀直在等待。
Oracle锁表查询和解锁⽅法数据库操作语句的分类DDL:数据库模式定义语⾔,关键字:createDML:数据操纵语⾔,关键字:Insert、delete、updateDCL:数据库控制语⾔,关键字:grant、removeDQL:数据库查询语⾔,关键字:selectoracle表在什么情况下会被锁住DML锁⼜可以分为,⾏锁、表锁、死锁⾏锁:当事务执⾏数据库插⼊、更新、删除操作时,该事务⾃动获得操作表中操作⾏的排它锁。
表级锁:当事务获得⾏锁后,此事务也将⾃动获得该⾏的表锁(共享锁),以防⽌其它事务进⾏DDL语句影响记录⾏的更新。
事务也可以在进⾏过程中获得共享锁或排它锁,只有当事务显⽰使⽤LOCK TABLE语句显⽰的定义⼀个排它锁时,事务才会获得表上的排它锁,也可使⽤LOCK TABLE显⽰的定义⼀个表级的共享锁(LOCK TABLE具体⽤法请参考相关⽂档)。
死锁:当两个事务需要⼀组有冲突的锁,⽽不能将事务继续下去的话,就出现死锁。
如事务1在表A⾏记录#3中有⼀排它锁,并等待事务2在表A中记录#4中排它锁的释放,⽽事务2在表A记录⾏#4中有⼀排它锁,并等待事务1在表A中记录#3中排它锁的释放,事务1与事务2彼此等待,因此就造成了死锁。
死锁⼀般是因拙劣的事务设计⽽产⽣。
死锁只能使⽤SQL下:alter system kill session “sid,serial#”;或者使⽤相关操作系统kill进程的命令,如UNIX下kill -9 sid,或者使⽤其它⼯具杀掉死锁进程。
DDL锁⼜可以分为:排它DDL锁、共享DDL锁、分析锁排它DDL锁:创建、修改、删除⼀个数据库对象的DDL语句获得操作对象的排它锁。
如使⽤alter table语句时,为了维护数据的完成性、⼀致性、合法性,该事务获得⼀排它DDL锁。
oracle死锁及处理方式
Oracle死锁查询及处理关于数据库死锁的检查方法一、数据库死锁的现象程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。
二、死锁的原理当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态,此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错。
三、死锁的定位方法通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台。
1)用dba用户执行以下语句select username,lockwait,status,machine,program from v$session where sid in(select session_id from v$locked_object)如果有输出的结果,则说明有死锁,且能看到死锁的机器是哪一台。
字段说明:Username:死锁语句所用的数据库用户;Lockwait:死锁的状态,如果有内容表示被死锁。
Status:状态,active表示被死锁Machine:死锁语句所在的机器。
Program:产生死锁的语句主要来自哪个应用程序。
2)用dba用户执行以下语句,可以查看到被死锁的语句。
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))四、死锁的解决方法一般情况下,只要将产生死锁的语句提交就可以了,但是在实际的执行过程中。
用户可能不知道产生死锁的语句是哪一句。
可以将程序关闭并重新启动就可以了。
经常在Oracle的使用过程中碰到这个问题,所以也总结了一点解决方法。
1)查找死锁的进程:sqlplus "/as sysdba" (sys/change_on_install)SELECT ername,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,l.ORACLE_USERNAME,l.OS_USE R_NAME,l.PROCESSFROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;2)kill掉这个死锁的进程:alter system kill session ‘sid,serial#’; (其中sid=l.session_id)3)如果还不能解决:select pro.spid from v$session ses,v$process pro where ses.sid=XX andses.paddr=pro.addr;其中sid用死锁的sid替换: exitps -ef|grep spid其中spid是这个进程的进程号,kill掉这个Oracle进程from:/blog/550832select A.SQL_TEXT, ERNAME, C.OBJECT_ID, C.SESSION_ID,B.SERIAL#,C.ORACLE_USERNAME,C.OS_USER_NAME,C.Process,''''||C.Session_ID||','||B.SERIAL#||''''from v$sql A, v$session B, v$locked_object Cwhere A.HASH_VALUE = B.SQL_HASH_VALUE andB.SID =C.Session_IDoracle死锁解决办法1.查哪个过程被锁查V$DB_OBJECT_CACHE视图:SELECT * FROM V$DB_OBJECT_CACHE WHERE OW NER='过程的所属用户' AND LOCKS!='0';2. 查是哪一个SID,通过SID可知道是哪个SESSION.查V$ACCESS视图:SELECT * FROM V$ACCESS W HERE OWNER='过程的所属用户' AND NAME='刚才查到的过程名';3. 查出SID和SERIAL#查V$SESSION视图:SELECT SID,SERIAL#,PADDR FROM V$SESSION W HERE SID='刚才查到的SID'查V$PROCESS视图:SELECT SPID FROM V$PROCESS W HERE ADDR='刚才查到的PADDR';4. 杀进程(1).先杀ORACLE进程:ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#';(2).能过CMD控制台,再杀操作系统进程:ORAKILL 数据库实现刚才查出的SPID一定要记住,要把之前查出的死锁记下来,然后,一一对其Kill,如果Kill不干净的话,还是解决不了问题。
数据库死锁问题的分析与解决方法
数据库死锁问题的分析与解决方法数据库系统是当今大部分企业和组织中不可或缺的一部分,它的功能强大且高效。
然而,由于数据库操作的并发性质,死锁问题可能会在一些情况下发生。
本文将分析数据库死锁问题,并提供解决这些问题的方法。
一、数据库死锁问题的原因分析当多个并发数据库操作需要同时访问某个资源时,可能会导致死锁问题的发生。
下面是导致死锁问题的主要原因:1. 互斥条件:数据库资源一次只能被一个进程或事务所持有。
2. 占有和等待条件:一个进程或事务持有某个资源的同时,又等待其他的资源。
3. 不可抢占条件:已经被其他进程或事务持有的资源不能被抢占。
4. 循环等待条件:多个进程或事务形成一个环形等待资源的队列。
二、数据库死锁问题的解决方法针对数据库死锁问题,我们可以采取以下解决方法:1. 死锁检测与恢复:- 死锁检测:通过死锁检测算法,系统能够监测到死锁的发生,并及时做出响应。
- 死锁恢复:当系统检测到死锁时,可以采取回滚(Rollback)操作,将所有死锁进程或事务的操作都回退到一个安全点,解除死锁状态。
2. 死锁预防:- 仔细设计数据库系统的并发控制机制,确保互斥条件的满足。
- 避免占有和等待条件,即在进程获取资源之前,先释放已经拥有的资源。
- 破坏不可抢占条件,即已经被其他进程或事务持有的资源可以被抢占。
3. 死锁避免:- 安全序列:系统为每个进程或事务规定一个安全执行序列,保证在执行序列过程中不会出现死锁现象。
- 资源分配图:系统维护一个资源分配图,每个节点表示一个进程或事务,每个边表示一个资源,并通过图来检测是否会出现死锁。
- 银行家算法:根据资源的最大需求量和已分配量,预测系统中是否会发生死锁,并进行相应的资源分配。
4. 死锁解决与解除:- 强制回滚:通过回滚操作解除死锁,并重新调度等待资源的进程或事务。
- 超时机制:当某个进程或事务等待资源的时间超过一定阈值时,系统可以主动中断该进程或事务的操作,解除死锁状态。
Oracle死锁问题的解决方法
Oracle死锁问题的解决方法报送单位:审核人:类型:运维管理关键字: Oracle 死锁1、引言每个使用关系型数据库的程序都可能遇到数据死锁的情况,Oracle数据库也不例外,虽然Oracle提供了防死锁机制,但有时还是会发生死锁现象.下面就给大家分析下ORACLE数据库死锁问题,并详细介绍问题分析的步骤,以及解决此问题的主要操作,供大家学习和参考。
2、故障现象我在5月号做数据库巡检时发现在数据库系统日志中有一条错误信息,截图如下:3、处理过程1.查哪个过程被锁查V$DB_OBJECT_CACHE视图:SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER='过程的所属用户' AND LOCKS!='0';2. 查是哪一个SID,通过SID可知道是哪个SESSION.查V$ACCESS视图:SELECT * FROM V$ACCESS WHERE OWNER='过程的所属用户' AND NAME='刚才查到的过程名';3. 查出SID和SERIAL#查V$SESSION视图:SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='刚才查到的SID'查V$PROCESS视图:SELECT SPID FROM V$PROCESS WHERE ADDR='刚才查到的PADDR';4. 杀进程(1).先杀Oracle进程:ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#';(2).能过CMD控制台,再杀操作系统进程:ORAKILL 数据库实现刚才查出的SPID一定要记住,要把之前查出的Oracle死锁记下来,然后,一一对其Kill,如果Kill不干净的话,还是解决不了问题4、原因分析这个还是举例好理解:有t1和t2两张表,每个表里都有一条记录。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracle常见死锁发生的原因以及解决方法Oracle常见死锁发生的原因以及解决办法一,删除和更新之间引起的死锁造成死锁的原因就是多个线程或进程对同一个资源的争抢或相互依赖。
这里列举一个对同一个资源的争抢造成死锁的实例。
Oracle 10g, PL/SQL version 9.2CREATE TABLE testLock( ID NUMBER,test VARCHAR(100) )COMMITINSERT INTO testLock VALUES(1,'test1');INSERT INTO testLock VALUES(2,'test2');COMMIT;SELECT * FROM testLock1. ID TEST2.---------- ----------------------------------3. 1 test14. 2 test2死锁现象的重现:1)在sql 窗口执行:SELECT * FROM testLock FOR UPDATE; -- 加行级锁并对内容进行修改,不要提交2)另开一个command窗口,执行:delete from testLock WHERE ID=1;此时发生死锁(注意此时要另开一个窗口,不然会提示:POST THE CHANGE RECORD TO THE DATABASE. 点yes 后强制commit):3)死锁查看:1.SQL> select ername,l.object_id, l.session_id,s.serial#, s.lockwait,s.status,s.machine,s.program from v$session s,v$locked_object l where s.sid = l.session_id;</p><p>USER NAME SESSION_ID SERIAL# LOCKWAIT STATUS MACHINE PROGRAM2.---------- ---------- ---------- -------- -------- ---------------------- ------------3.SYS 146 104 INACTIVE WORKGROUP\J-THINK PLSQLDev.exe4.SYS 144 145 20834474 ACTIVE WORKGROUP\J-THINK PLSQLDev.exe字段说明:Username:死锁语句所用的数据库用户;SID: session identifier,session 标示符,session 是通信双方从开始通信到通信结束期间的一个上下文。
SERIAL#: sid 会重用,但是同一个sid被重用时,serial#会增加,不会重复。
Lockwait:可以通过这个字段查询出当前正在等待的锁的相关信息。
Status:用来判断session状态。
Active:正执行SQL语句。
Inactive:等待操作。
Killed:被标注为删除。
Machine:死锁语句所在的机器。
Program:产生死锁的语句主要来自哪个应用程序。
4)查看引起死锁的语句:SQL> select sql_text from v$sql where hash_value in (select sql_hash_value from v$se ssion where sid in (select session_id from v$locked_object));1.2.SQL_TEXT3.------------------------------------------------------------1.delete from testLock where ID = 15)死锁的处理:SQL> alter system kill session '144,145';1.2.System altered3.4.Executed in 1.061 seconds此时在执行delete语句的窗口出现:SQL> delete from testLock where ID = 1;1.2.delete from testLock where ID = 13.4.ORA-00028: 您的会话己被终止再查看一下死锁,会发现已经没有stauts为active的记录了:SQL> select ername, l.session_id,s.serial#, s.lockwait,s.status,s.machine,s.program from v$session s,v$locked_object l where s.sid = l.session_id;1.ERNAME SESSION_ID SERIAL# LOCKWAIT STATUS MACHINE PROGRAM3.------------- ---------- ---------- -------- -------- --------------------------- ----------------1.SYS 146 104 INACTIVE WORKGROUP\J-THINK PLSQLDev.exe2.3.Executed in 0.032 seconds发生死锁的语句已经被终止。
二,在外键上没有加索引引起的死锁客户的10.2.0.4 RAC for AIX环境频繁出现ORA-60死锁问题,导致应用程序无法顺利执行。
经过一系列的诊断,发现最终问题是由于外键上没有建立索引所致,由于程序在主子表上删除数据,缺少索引导致行级锁升级为表级锁,最终导致大量的锁等待和死锁。
下面通过一个例子简单模拟一下问题:SQL> create table t_p (id number primary key, name varchar2(30));Table created.SQL> create table t_f (fid number, f_name varchar2(30), foreign key (fid) referencest_p);Table created.SQL> insert into t_p values (1, 'a');1 row created.SQL> insert into t_f values (1, 'a');1 row created.SQL> insert into t_p values (2, 'b');1 row created.SQL> insert into t_f values (2, 'c');1 row created.SQL> commit;Commit complete.SQL> delete t_f where fid = 2;1 row deleted.这时在会话2同样对子表进行删除:SQL2> delete t_f where fid = 1;1 row deleted.回到会话1执行主表的删除:SQL> delete t_p where id = 2;会话被锁,回到会话2执行主表的删除:SQL2> delete t_p where id = 1;会话同样被锁,这时会话1的语句被回滚,出现ORA-60死锁错误:delete t_p where id = 2*ERROR at line 1:ORA-00060: deadlock detected while waiting for resourceSQL> rollback;Rollback complete.将会话1操作回滚,会话2同样回滚并建立外键列上的索引:1 row deleted.SQL2> rollback;Rollback complete.SQL2> create index ind_t_f_fid on t_f(fid);Index created.重复上面的步骤会话1删除子表记录:SQL> delete t_f where fid = 2;1 row deleted.会话2删除子表记录:SQL2> delete t_f where fid = 1;1 row deleted.会话1删除主表记录:SQL> delete t_p where id = 2;1 row deleted.会话2删除主表记录:SQL> delete t_p where id = 1;1 row deleted.所有的删除操作都可以成功执行,关于两种情况下锁信息的不同这里就不深入分析了,重点就是在外键列上建立索引。
虽然有一些文章提到过,如果满足某些情况,可以不在外键列上建立的索引,但是我的观点一向是,既然创建了外键,就不要在乎再多一个索引,因为一个索引所增加的代价,与缺失这个索引所带来的问题相比,是微不足道的。
【补充】Oracle 10g和Oracle 9i trc日志内容的差别最主要的差别是在Oracle 10g中提示了等待资源的两条sql语句,在Oracle 9i中,只显示检测到死锁的sql语句Oracle 10g 10.2.0.3.0:DEADLOCK DETECTED ( ORA-00060 )[Transaction Deadlock]The following deadlock is not an ORACLE error. It is adeadlock due to user error in the design of an applicationor from issuing incorrect ad-hoc SQL. The followinginformation may aid in determining the deadlock:Deadlock graph:---------Blocker(s)-----------------Waiter(s)---------Resource Name process session holds waits process session holds waitsTM-0000dd55-00000000 16 146 SX SSX 17 148 SX SSXSX SSXsession 146: DID 0001-0010-00000008 session 148: DID0001-0011-00000006session 148: DID 0001-0011-00000006 session 146: DID0001-0010-00000008Rows waited on:Session 148: no rowSession 146: no rowInformation on the OTHER waiting sessions:Session 148:pid=17 serial=39 audsid=540046 user: 54/SCOTTO/S info: user: SKYHOME\sky, term: SKYHOME, ospid: 3028:7000, machine: WORKGROUP\SKYHOMEprogram: plsqldev.exeapplication name: PL/SQL Developer, hash value=1190136663action name: Command Window - New, hash value=254318129Current SQL Statement:delete t_p where id = 1End of information on OTHER waiting sessions.Current SQL statement for this session:delete t_p where id = 2Oracle 9i 9.2.0.7.0:DEADLOCK DETECTEDCurrent SQL statement for this session:delete t_p where id = 2The following deadlock is not an ORACLE error. It is adeadlock due to user error in the design of an applicationor from issuing incorrect ad-hoc SQL. The followinginformation may aid in determining the deadlock:Deadlock graph:---------Blocker(s)-----------------Waiter(s)---------Resource Name process session holds waits process session holds waitsSX SSXTM-0000260e-00000000 23 20 SX SSX 21 51 SX SSXsession 51: DID 0001-0015-0000043D session 20: DID0001-0017-00000397session 20: DID 0001-0017-00000397 session 51: DID0001-0015-0000043DRows waited on:Session 20: no rowSession 51: no rowInformation on the OTHER waiting sessions:Session 20:pid=23 serial=53179 audsid=197296 user: 87/scottO/S info: user: sky, term: SKYHOME, ospid: 5540:4984, machine: WORKGROUP\SKYHOMEprogram: plsqldev.execlient info: 127.0.0.1application name: PL/SQL Developer, hash value=1190136663action name: Command Window - New, hash value=254318129Current SQL Statement:delete t_p where id = 1End of information on OTHER waiting sessions.三,两个表之前不同顺序之间的相互更新操作引起的死锁Oracle中的死锁:注:4个update语句的执行顺序按图中位置自上而下图中左边会话中断(此时不回滚也不提交,等待用户决定),右边会话阻塞,等待左边会话释放a表上的锁。