一.删除和更新之间引起的死锁

造成死锁的原因就是多个线程或进程对同一个资源的争抢或相互依赖。这里列举一个对同一个资源的争抢造成死锁的实例。

CREATE

TABLE

testLock(

ID NUMBER,

test

VARCHAR

(100)

)

COMMIT

INSERT

INTO

testLock

VALUES

(1,

'test1'

);

INSERT

INTO

testLock

VALUES

(2,

'test2'

);

COMMIT

;

SELECT

*

FROM

testLock

ID TEST

---------- ----------------------------------

1 test1

2 test2

死锁现象的重现:

1.

在sql 窗口 执行:SELECT * FROM testLock FOR UPDATE; -- 加行级锁 并对内容进行修改,不要提交

查询死锁:

select

s.username,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;

字段说明:

Username:死锁语句所用的数据库用户;

SID: session identifier, session 标示符,session 是通信双方从开始通信到通信结束期间的一个上下文。

SERIAL#: sid 会重用,但是同一个sid被重用时,serial#会增加,不会重复。

Lockwait:可以通过这个字段查询出当前正在等待的锁的相关信息。

Status:用来判断session状态。Active:正执行SQL语句。Inactive:等待操作。Killed:被标注为删除。

Machine: 死锁语句所在的机器。

Program: 产生死锁的语句主要来自哪个应用程序。

此时有一行在命令在等待操作

Inactive

查看引起死锁的语句:

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));

此时没有死锁的语句。

2.另开一个command窗口,执行:delete from testLock WHERE ID=1;

此时发生死锁(注意此时要另开一个窗口,不然会提示:POST THE CHANGE RECORD TO THE DATABASE. 点yes 后强制commit):

死锁查看:

SQL>

select

s.username,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;

查看引起死锁的语句:

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));

查出以下语句死锁:

delete

from

testLock

where

ID = 1

死锁的处理:

alter system kill session 'session_id,serial#';

alter system kill session '301,16405';

再查看一下死锁,会发现已经没有stauts为active的记录了,

发生死锁的语句已经被终止。

二.在外键上没有加索引引起的死锁

客户的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) references t_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 resource

SQL> 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 行级死锁_Oracle常见死锁发生的原因以及解决方法相关推荐

  1. 常见的内存泄漏原因及解决方法

    常见的内存泄漏原因及解决方法 参考文章: (1)常见的内存泄漏原因及解决方法 (2)https://www.cnblogs.com/leeego-123/p/12187677.html 备忘一下.

  2. Android 系统(87)---常见的内存泄漏原因及解决方法

    常见的内存泄漏原因及解决方法 (Memory Leak,内存泄漏) 为什么会产生内存泄漏? 当一个对象已经不需要再使用本该被回收时,另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被 ...

  3. 计算机换用户无法启动软件吗,电脑软件无法启动常见的三种原因以及解决方法...

    日常生活中,我们的电脑总会遇到各种各样的问题,掌握了修电脑的技能,会对我们有很大的帮助,至少出现问题的时候不会手忙脚乱,打乱我们的工作计划,或者花冤枉钱拿出去修,下面就给大家简单讲述电脑软件无法启动常 ...

  4. 计算机无法启动的原因及解决方法,电脑软件无法启动常见的三种原因以及解决方法...

    日常生活中,我们的电脑总会遇到各种各样的问题,掌握了修电脑的技能,会对我们有很大的帮助,至少出现问题的时候不会手忙脚乱,打乱我们的工作计划,或者花冤枉钱拿出去修,下面就给大家简单讲述电脑软件无法启动常 ...

  5. 系统常见电脑蓝屏原因以及解决方法

    ​如果你的电脑最近在使用的时候会突然蓝屏,直观图时候我们怎么解决呢?下面让我们一起来看一下电脑蓝屏怎么解决吧. 电脑重装系统如何操作 1.系统问题(某个更新的补丁BUG,某系统文件损坏等,或者系统中存 ...

  6. DNS(域名系统)介绍,深入解析DNS解析失败发生的原因及解决方法

    域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务.它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网.DNS使用TCP和UDP端口53. ...

  7. nginx常见502错误提示原因和解决方法

    Nginx 502错误情况1: 网站的访问量大,而php-cgi的进程数偏少. 针对这种情况的502错误,只需增加php-cgi的进程数.具体就是修改/usr/local/php/etc/php-fp ...

  8. mysql 死锁原因_Mysql并发时经典常见的死锁原因及解决方法

    1.mysql都有什么锁 MySQL有三种锁的级别:页级.表级.行级. 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低. 行级锁:开销大,加锁慢:会出现死锁:锁定粒 ...

  9. MySQL学习笔记(五)并发时经典常见的死锁原因及解决方法

    MySQL学习笔记(五)并发时经典常见的死锁原因及解决方法 参考文章: (1)MySQL学习笔记(五)并发时经典常见的死锁原因及解决方法 (2)https://www.cnblogs.com/tiny ...

最新文章

  1. 同是程序员,为什么别人可以事半功倍?
  2. Git 添加到Git 仓库
  3. 测试Hibernate的最低配置
  4. UVA-714 二分
  5. 一次Web请求返回406原因与解决方案
  6. pip 安装包时出现的连接超时、host不信任问题解决方案
  7. 基于vitamio的网络电视直播源代码
  8. ios系统gps测试软件,GPS工具箱苹果版
  9. 工作中的十大棘手难题
  10. 计算机安全中采用的用户身份验证技术主要有,探究用户身份认证技术在信息安全中运用的意义...
  11. css渐变背景色与切角
  12. 再探阿里的“数据+业务”双中台架构
  13. mysql5.7免安装版配置与修改密码
  14. 微信小程序—半圆(弧形)进度条
  15. 当你对一个聊天机器人敞开了心扉
  16. 单片机很好玩 ,制作呼吸灯(转载)
  17. 少女时代动态android,少女时代攻「V APP」!连续8天live直播大放送
  18. 三元赫尔德不等式_赫尔德不等式
  19. android生命周期home键,Android横竖屏切换, 手机锁屏以及按Home键和返回键时的Activity的生命周期...
  20. WebLoading开源库,支持https访问

热门文章

  1. python画界面的插件_ImagePy——UI界面支持开放插件的Python开源图像处理框架
  2. 解决电脑右键点击文件转圈,然后卡死刷新的问题
  3. 默哀日、灾难日,纪念日,哀悼日等网站都变成黑白色
  4. 测序中,什么是“测通”
  5. 传统弓上弦的几种方式
  6. EfficientNet网络详解
  7. prf###.tmp临时文件导致磁盘资源不足
  8. php毫米级监控,监控镜头毫米数与距离对照表
  9. matlab蒙特卡罗方法求体积_蒙特卡罗方法详细讲解与MATLAB实现.ppt
  10. mini.DataGrid使用说明