简单说明简单说明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:
评论0