当前位置:  数据库>oracle

两个Oracle死锁解决实例

    来源: 互联网  发布时间:2017-06-17

    本文导语: 关于数据库中的死锁。如果在应用中碰到都会毫不犹豫转交给DBA,但是从目前我接到的deadlock的问题来看,和Oracle官方的描述基本都是一致的。 The following deadlock is not an ORACLE error. It is a deadlock due to user error in the design of an applicati...

关于数据库中的死锁。如果在应用中碰到都会毫不犹豫转交给DBA,但是从目前我接到的deadlock的问题来看,和Oracle官方的描述基本都是一致的。
The following deadlock is not an ORACLE error. It is a deadlock due to user error in the design of an application
or from issuing incorrect ad-hoc SQL. The following information may aid in determining the deadlock:

死锁在Oracle中处理时,会自动事务相关的DML语句撤销。换句话说,就是Oracle对于死锁 问题的处理时一个主动的过程,会主动切断其中一个session的事务锁。

先来看一个简单的死锁案例。

我们创建两个表lock_test1,lock_test2,然后使用两个session来说明。

session1:

首先在session1中先创建两个表,lock_test1,lock_test2

n1@TEST11G> create table lock_test1 as select *from cat;

Table created.

n1@TEST11G> create table lock_test2 as select *from cat;                                         

Table created.

然后尝试对lock_test1做delete操作。

n1@TEST11G> delete from lock_test1;

20 rows deleted.

session2:

然后切换到session2,对lock_test2做delete操作。

n1@TEST11G> delete from lock_test2;

21 rows deleted.

紧接着,在session1中对lock_test2做delete操作,这个时候出现阻塞的情况,一直没有响应。

session1:

n1@TEST11G> delete from lock_test2;

 

我们在session2中,继续对表Lock_test1做delete操作,这个时候会有短暂的停顿,就会发现session1中的事务被强行撤销了。

session2:

n1@TEST11G> delete from lock_test1;

 

session1中的日志如下,可以看到这个时候session1中的事务被强行撤销了。

n1@TEST11G> delete from lock_test2;

delete from lock_test2

            *

ERROR at line 1:

ORA-00060: deadlock detected while waiting for resource

这个问题可以简单用下面的步骤来说明。

?Session a  table1

?Session b  table2

?Session a  table 2

?Session b  table1

到此为止我们可以看到,死锁产生的影响是很大的,当然,问题还不止于此,在多个表之间很可能存在死锁现象,对于一个表,也有可能出现死锁现象。

我们来简单说明示例一下。

session1:

create table test as select *from user_tables;

n1@TEST11G> delete from test where table_name='LOCK_TEST1';

1 row deleted.

session2:

n1@TEST11G> DELETE FROM TEST WHERE TABLE_NAME='LOCK_TEST2';

1 row deleted.

session1:

n1@TEST11G> DELETE FROM TEST WHERE TABLE_NAME='LOCK_TEST2';

session2:

n1@TEST11G> DELETE FROM TEST WHERE TABLE_NAME='LOCK_TEST1';

这个时候还是会出现一样的死锁问题,这个时候在对应的行上会有相应的锁。在session2中会有短暂的停顿,然后把session1中的

给撤销了,产生的日志如下:

DELETE FROM TEST WHERE TABLE_NAME='LOCK_TEST2'

  *

ERROR at line 1:

ORA-00060: deadlock detected while waiting for resource

可见死锁的问题还是很容易产生的,在编程中处理多并发的处理时还是需要多多注意。


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • cocos2d中CCSpriteFrameCache文件同时存在两个plist的问题解决
  • 有两个问题一直没有解决,请高手赐教
  • 求教:两个进程间大量数据传输的解决方法
  • 不解决也给分。如何使用vmware?我的能用vmware运行两个操作系统吗?
  • 有两个问题需要解决一下
  • 如何解决两个子进程竞争
  • 原来装了linux和window2K两个系统,今天又装了个winxp,结果找不到启动linux的菜单呢?请问如何解决,先谢了!
  • 我只用了一台电脑啊 ,两个系统(xp,ubuntu11.10),却被sb的联通公司判断为两台电脑,然后被封号了,怎么解决?避免被封号
  • Python实现全局变量的两个解决方法
  • 请教两个脚本问题,高手帮忙解决一下吧,谢谢了
  • 调试程序有两个bug不知道怎么解决,请高手指点
  • [求助]安装双系统崩溃,两个系统都进不去,求解决!
  • 怎样解决这两个警告?
  • C++实现两个日期间差多少天的解决方法
  • 程序中两个Double类型相加出现误差的解决办法
  • 最近看apue,程序4-10中,编译时,使用两个宏major和minor来访问主次设备号,没有定义是怎么回事,应该怎么解决呢?
  • 两个变量合在一起输出有空格--怎么解决?DOS bat文件
  • PHP编译安装中遇到的两个错误和解决方法
  • 这个版有没有学linux超过两个月的?我问个简单问题,解决了加200分。
  • lilo到底是装在那里的啊?我格linux的两个分区居然lilo还在并能用。解决就给分!
  • 不好意思老问题.我查过了所有的帖子,还是不能解决jdk+tomcat配置的问题.已经两个月了,我都不好意思说了
  • C++ MultiMaps 成员 swap():交换两个multimaps
  • 急!有两个char buf[]里面是两个日期(2004-08-02),怎样判断两个日期之间的天数?(只能用标准C)
  • C++ Lists(链表) 成员 merge():合并两个list
  • 一个Statement不能同时打开两个ResultSet?为了同时打开两个,可以考虑建立两个Statement?甚至两个Connection?
  • C++ Lists(链表) 成员 swap():交换两个list
  • 两个域名,两个端口,一个服务器……
  • C++ Maps 成员 swap():交换两个map
  • 你们看是不是可以这样理解:在用来进行两个对象的比较时,==操作符用来比较两个对象的引用地址,而equals()用来比较两个对象的值。
  • C++ Vectors 成员 swap():交换两个Vector
  • 下载了jbuilder5,是rar格式的,解开后有两个文件,一个是rsc-jb5.bin,一个是rsc-jb5.cue,据说这两个文件是刻光盘的,请问谁知道怎么刻?不会用这两个文件直接安装吧?谢谢!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3