oracle死锁语句查询
2015-07-24 11:02
513 查看
造成死锁的原因就是多个线程或进程对同一个资源的争抢或相互依赖。这里列举一个对同一个资源的争抢造成死锁的实例。
Oracle 10g, PL/SQL version 9.2
[sql] view
plaincopy
CREATE TABLE testLock(
ID NUMBER,
test VARCHAR(100)
)
COMMIT
INSERT INTO testLock VALUES(1,'test1');
INSERT INTO testLock VALUES(2,'test2');
COMMIT;
[sql] view
plaincopy
SELECT * FROM testLock
ID TEST
---------- ----------------------------------
1 test1
2 test2
死锁现象的重现:
1)在sql 窗口 执行:SELECT * FROM testLock FOR UPDATE; -- 加行级锁 并对内容进行修改,不要提交
2)另开一个command窗口,执行:delete from testLock WHERE ID=1;
此时发生死锁(注意此时要另开一个窗口,不然会提示:POST THE CHANGE RECORD TO THE DATABASE. 点yes 后强制commit):
3)死锁查看:
[sql] view
plaincopy
<p> </p><p>
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;</p><p>USERNAME SESSION_ID SERIAL# LOCKWAIT STATUS MACHINE PROGRAM
---------- ---------- ---------- -------- -------- ---------------------- ------------
SYS 146 104 INACTIVE WORKGROUP\J-THINK PLSQLDev.exe
SYS 144 145 20834474 ACTIVE WORKGROUP\J-THINK PLSQLDev.exe</p><p> </p>
字段说明:
Username:死锁语句所用的数据库用户;
SID: session identifier, session 标示符,session 是通信双方从开始通信到通信结束期间的一个上下文。
SERIAL#: sid 会重用,但是同一个sid被重用时,serial#会增加,不会重复。越后面执行的sql语句serial#的越大
Lockwait:可以通过这个字段查询出当前正在执行的sql语句已经等待的时间。
Status:用来判断session状态。Active:正执行SQL语句,就是被死锁住的语句,无法继续执行下去。Inactive:等待操作,未提交的操作。Killed:被标注为删除。
其中
Machine: 死锁语句所在的机器。
Program: 产生死锁的语句主要来自哪个应用程序。
4)查看引起死锁的语句:
[sql] view
plaincopy
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));
SQL_TEXT
------------------------------------------------------------
[sql] view
plaincopy
delete from testLock where ID = 1
5)死锁的处理:
[sql] view
plaincopy
SQL> alter system kill session '144,145';
System altered
Executed in 1.061 seconds
session中两个参数分别是session_id和serial#
此时在执行delete语句的窗口出现:
[sql] view
plaincopy
SQL> delete from testLock where ID = 1;
delete from testLock where ID = 1
ORA-00028: 您的会话己被终止
再查看一下死锁,会发现已经没有stauts为active的记录了:
[sql] view
plaincopy
SQL> select s.username, 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 SESSION_ID SERIAL# LOCKWAIT STATUS MACHINE PROGRAM
------------- ---------- ---------- -------- -------- --------------------------- ----------------
[sql] view
plaincopy
SYS 146 104 INACTIVE WORKGROUP\J-THINK PLSQLDev.exe
Executed in 0.032 seconds
发生死锁饿语句已经被终止。
引用:
教您如何检查oracle死锁
Oracle死锁的处理
Oracle 动态性能表
v$session & v$process
Oracle 10g, PL/SQL version 9.2
[sql] view
plaincopy
CREATE TABLE testLock(
ID NUMBER,
test VARCHAR(100)
)
COMMIT
INSERT INTO testLock VALUES(1,'test1');
INSERT INTO testLock VALUES(2,'test2');
COMMIT;
[sql] view
plaincopy
SELECT * FROM testLock
ID TEST
---------- ----------------------------------
1 test1
2 test2
死锁现象的重现:
1)在sql 窗口 执行:SELECT * FROM testLock FOR UPDATE; -- 加行级锁 并对内容进行修改,不要提交
2)另开一个command窗口,执行:delete from testLock WHERE ID=1;
此时发生死锁(注意此时要另开一个窗口,不然会提示:POST THE CHANGE RECORD TO THE DATABASE. 点yes 后强制commit):
3)死锁查看:
[sql] view
plaincopy
<p> </p><p>
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;</p><p>USERNAME SESSION_ID SERIAL# LOCKWAIT STATUS MACHINE PROGRAM
---------- ---------- ---------- -------- -------- ---------------------- ------------
SYS 146 104 INACTIVE WORKGROUP\J-THINK PLSQLDev.exe
SYS 144 145 20834474 ACTIVE WORKGROUP\J-THINK PLSQLDev.exe</p><p> </p>
字段说明:
Username:死锁语句所用的数据库用户;
SID: session identifier, session 标示符,session 是通信双方从开始通信到通信结束期间的一个上下文。
SERIAL#: sid 会重用,但是同一个sid被重用时,serial#会增加,不会重复。越后面执行的sql语句serial#的越大
Lockwait:可以通过这个字段查询出当前正在执行的sql语句已经等待的时间。
Status:用来判断session状态。Active:正执行SQL语句,就是被死锁住的语句,无法继续执行下去。Inactive:等待操作,未提交的操作。Killed:被标注为删除。
其中
Machine: 死锁语句所在的机器。
Program: 产生死锁的语句主要来自哪个应用程序。
4)查看引起死锁的语句:
[sql] view
plaincopy
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));
SQL_TEXT
------------------------------------------------------------
[sql] view
plaincopy
delete from testLock where ID = 1
5)死锁的处理:
[sql] view
plaincopy
SQL> alter system kill session '144,145';
System altered
Executed in 1.061 seconds
session中两个参数分别是session_id和serial#
此时在执行delete语句的窗口出现:
[sql] view
plaincopy
SQL> delete from testLock where ID = 1;
delete from testLock where ID = 1
ORA-00028: 您的会话己被终止
再查看一下死锁,会发现已经没有stauts为active的记录了:
[sql] view
plaincopy
SQL> select s.username, 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 SESSION_ID SERIAL# LOCKWAIT STATUS MACHINE PROGRAM
------------- ---------- ---------- -------- -------- --------------------------- ----------------
[sql] view
plaincopy
SYS 146 104 INACTIVE WORKGROUP\J-THINK PLSQLDev.exe
Executed in 0.032 seconds
发生死锁饿语句已经被终止。
引用:
教您如何检查oracle死锁
Oracle死锁的处理
Oracle 动态性能表
v$session & v$process
相关文章推荐
- 解读 Oracle 12c 的 12 个新特性
- oracle initialization or shutdown in progress
- Linux中设置定期备份oracle数据库
- Oracle session nls_date_format
- oracle 数据库设计的一些原则
- Oracle 11g R2之物理Dataguard 重命名数据文件
- oracle中的exists 和not exists 用法详解
- Linux 下 Oracle 内核参数优化
- java获得mysql和oracle链接的类
- Oracle 删除重复数据只留一条
- CentOS7_x86_64安装Oracle10g R2血泪史
- oracle 10g操作和维护手册
- oracle断开用户连接并且重新创建用户
- Oracle创建用户设置权限
- oracle的数据泵导入,导出以及创建用户及删除当前连接用户
- postgresql 中 类似 oracle EXECUTE IMMEDIATE 的写法
- oracle中trim,ltrim,rtrim函数的不同用法
- oracle中去除字符串两边的空格和,替换,截取字符串的函数
- oracle中粘贴字符函数的使用
- Oracle笔记(三)单行函数