简单说明Oracle数据库中对死锁的查询及解决方法

 更新时间:2016年01月21日 17:13:43   作者:董斌  
这篇文章主要介绍了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中处理时,会自动事务相关的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

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

相关文章

  • oracle中fdisk导致的ASM磁盘数据丢失的解决方法

    oracle中fdisk导致的ASM磁盘数据丢失的解决方法

    oracle中fdisk 导致的ASM磁盘数据丢失 有需要的朋友可参考一下
    2012-10-10
  • Oracle新增和删除用户

    Oracle新增和删除用户

    这篇文章介绍了Oracle新增和删除用户的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • 使用geotools导入shp文件到Oracle数据库时表名带下划线问题的解决方法

    使用geotools导入shp文件到Oracle数据库时表名带下划线问题的解决方法

    这篇文章主要介绍了使用geotools导入shp文件到Oracle数据库时表名带下划线的问题解决 的相关资料,需要的朋友可以参考下
    2016-08-08
  • oracle to_char函数将number转成string

    oracle to_char函数将number转成string

    很多数据转换处理操作时,会遇到将0.007007040000转换成0.70%的需求,我们使用Oracle 的SQL 函数 to_char可以实现这种转换,需要了解的朋友可以参考下
    2012-11-11
  • ORACLE数据表分析

    ORACLE数据表分析

    这篇文章介绍了ORACLE进行数据表分析的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Oracle常用函数超详细整理

    Oracle常用函数超详细整理

    Oracle是一种常用的关系型数据库管理系统,提供了许多内置函数,用于处理和操作数据,下面这篇文章主要给大家介绍了关于Oracle常用函数超详细整理的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • 关于expdp任务异常的处理案例详析

    关于expdp任务异常的处理案例详析

    这篇文章主要给大家介绍了关于expdp任务异常处理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • Oracle建立二进制文件索引的方法

    Oracle建立二进制文件索引的方法

    Oracle建立二进制文件索引的方法...
    2007-03-03
  • Oracle计算时间差为毫秒的实现代码

    Oracle计算时间差为毫秒的实现代码

    这里我是用分隔字符串单独计算毫秒部分,如果有更好的办法,请大家分享一下,下面是查询时间差为毫秒的模板,需要的朋友可以参考下
    2017-03-03
  • oracle 触发器 学习笔记

    oracle 触发器 学习笔记

    触发器 是特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用户不能直接调用他们。
    2009-05-05

最新评论