死锁产生的原因以及解决的方法

原因分析:

首先死锁是怎么发生的:

简单说,两个或多个并发事务相互等待,互补想让,没有外力就无法继续下去,这就制造了死锁。数据库检测到死锁时,就会将死锁的各个事务回滚,并抛出ORA-00060异常。所以上面报错出现的情况极少,将死锁解除后又可以正常运行。

解决思路:

死锁是无法根除的,特别在高并发的系统中。只有尽可能优化速度,减少互相等待的机会。

原则为:执行速度越快越好,访问资源时锁的范围越小越好。根据这个原则就可以优化我们的sql,将负责的sql拆分,若果业务允许的情况下。还有事务越小越好。

解决技巧:

1,出现死锁异常后,手工将死锁解开。

2,找出造成死锁的sql:

a,直接看日志:程序中日志做的很详细的话,是能够找到具体哪个sql报的错,操作的哪个表,还有别的模块也操作这个表,线程,并发的程序也会引起。

b,通过oracle的后台v$session表 和 v$sql 的分析 找到。

3,对sql进行优化。

时间: 2024-10-20 06:08:22

死锁产生的原因以及解决的方法的相关文章

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

Oracle常见死锁发生的原因以及解决办法 一,删除和更新之间引起的死锁 造成死锁的原因就是多个线程或进程对同一个资源的争抢或相互依赖.这里列举一个对同一个资源的争抢造成死锁的实例. Oracle 10g, PL/SQL version 9.2 CREATE TABLE testLock(  ID NUMBER, test VARCHAR(100)  ) COMMIT INSERT INTO testLock VALUES(1,'test1'); INSERT INTO testLock VAL

IE6,IE7,IE8下报JS错误:expected identifier, string or number的原因及解决的方法

今天在调试一个页面的时候遇到一个问题,在IE9下执行得非常好的脚本,在IE8里打开的时候弹出错误:expected identifier, string or number,依照经验,应该是定义对象的时候最后一个属性末尾跟了逗号,但检查一遍后没发现有这样的情况,后来细致看了一下报错的位置,发现有定义json对象属性时,属性名没实用引號括起来,于是加了上去再试,问题攻克了. 综上所述,当出现expected identifier, string or number的错误时,你首先应该检查在使用对象

Oracle死锁产生的原因和解决办法

如果有两个会话,每个会话都持有另一个会话想要的资源,此时就会发生死锁.用下面实验来说明死锁的产生原因和解决办法.SESSION1:SQL> create table t2 as select * from emp;SQL> select * from t2 where empno=7369; EMPNO ENAME      JOB              MGR HIREDATE                 SAL       COMM     DEPTNO---------- ---

mysql数据库死锁的产生原因及解决办法

这篇文章主要介绍了mysql数据库锁的产生原因及解决办法,需要的朋友可以参考下 数据库和操作系统一样,是一个多用户使用的共享资源.当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性.加锁是实现数据库并 发控制的一个非常重要的技术.在实际应用中经常会遇到的与锁相关的异常情况,当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁,严 重影响应用的正常执行. 在数据库中有两种基本的锁类型

兔子--R.java丢失原因及解决的方法

R.jar丢失原因: a:eclipse指向的adk路径有中文,或者是workspace路径有中文 b:xml文件里有错误或者引用的资源不存在 c:xml或者drawable下资源文件不能够有大写字母或者纯数字 d:eclipse或者adt版本号有问题.adt19常常出现bug. e:项目sdk的版本号太低或者不正确. f:项目编码格式不正确(常出如今导入项目的编码格式跟eclipse设置的编码格式不一致时候). 几种解决的方法: a:Eclipse菜单条--Project.点击Build Au

死锁产生的原因以及解决方法

一.什么是死锁? 死锁是由于两个或以上的线程互相持有对方需要的资源,导致这些线程处于等待状态,无法执行. 二.产生死锁的四个必要条件 1.互斥性:线程对资源的占有是排他性的,一个资源只能被一个线程占有,直到释放. 2.请求和保持条件:一个线程对请求被占有资源发生阻塞时,对已经获得的资源不释放. 3.不剥夺:一个线程在释放资源之前,其他的线程无法剥夺占用. 4.循环等待:发生死锁时,线程进入死循环,永久阻塞. 三.产生死锁的原因 1.竞争不可抢占性资源 p1已经打开F1,想去打开F2,p2已经打开

死锁产生的原因和解锁的方法

产生死锁的四个必要条件: (1) 互斥条件:一个资源每次只能被一个进程使用.(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放.(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺.(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系. 二 锁的分类 锁的类别有两种分法: 1. 从数据库系统的角度来看:分为独占锁(即排它锁),共享锁和更新锁 MS-SQL Server 使用以下资源锁模式. 锁模式 描述  共享 (S) :读锁,用于不更改或不

在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解失效的原因和解决方法

在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解是不会生效的. 比如,下面代码例子中,有两方法,一个有@Transational注解,一个没有.如果调用了有注解的addPerson()方法,会启动一个Transaction:如果调用updatePersonByPhoneNo(),因为它内部调用了有注解的addPerson(),如果你以为系统也会为它启动一个Transaction,那就错了,实际上是没有的. @Service public cla

@Transational)的方法,注解失效的原因和解决方法

在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解是不会生效的. 比如,下面代码例子中,有两方法,一个有@Transational注解,一个没有.如果调用了有注解的addPerson()方法,会启动一个Transaction:如果调用updatePersonByPhoneNo(),因为它内部调用了有注解的addPerson(),如果你以为系统也会为它启动一个Transaction,那就错了,实际上是没有的. @Service public cla