如何检查oracle死锁

发布网友 发布时间:2022-04-22 04:54

我来回答

2个回答

热心网友 时间:2022-04-07 18:56

oracle死锁问题一直困扰着我们,下面就教您一个oracle死锁的检查方法,如果您之前遇到过oracle死锁方面的问题,不妨一看。一、数据库死锁的现象程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。二、oracle死锁的原理当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态,此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错。三、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用户执行以下语句,可以查看到被死锁的语句。以下是代码片段:

热心网友 时间:2022-04-07 20:14

Oracle会自动检测死锁并解决 所以不存在检查死锁这一说。

只有是在死锁发生后 去了解 产生死锁的原因, 这一般需要参考 死锁错误ORA-60错误所产生的日志。
如果自己搞不定可以找ASKMACLEAN专业ORACLE数据库修复团队成员帮您恢复!
例如:

Deadlock graph:
---------Blocker(s)-------- ---------Waiter(s)---------
Resource Name process session holds waits process session holds waits
TX-002a000c-000b7ac7 124 1223 X 367 2078 X
TX-0032001d-0006d9a1 367 2078 X 124 1223 X

session 1223: DID 0001-007C-00223740 session 2078: DID 0001-016F-00013484
session 2078: DID 0001-016F-00013484 session 1223: DID 0001-007C-00223740

Rows waited on:
Session 1223: obj - rowid = 00039287 - AAA5KHAAgAAAJcQACo
(dictionary objn - 234119, file - 32, block - 38672, slot - 168)
Session 2078: obj - rowid = 00038F03 - AAA48DAAeAABDTzAAm
(dictionary objn - 233219, file - 30, block - 275699, slot - 38)

LOG_RECORD_DETAIL objn - 233219
LOG_RECORD_IDCARD objn - 234119,

session 2078 先锁住了 LOG_RECORD_IDCARD ,之后尝试锁LOG_RECORD_DETAIL
session 1223 先锁住了 LOG_RECORD_DETAIL ,之后尝试锁 LOG_RECORD_IDCARD

session 2078的SQL执行顺序:

1、 SELECT D.FIRST_LOGIN_TIME, D.ONLINE_SECOND_TOTAL, D.OFFLINE_SECOND_TOTAL, D.USER_COUNT FROM LOG_RECORD_IDCARD D WHERE GAME_ID = :B2 AND ID_CODE = :B1 FOR UPDATE
2、 UPDATE LOG_RECORD_DETAIL SET LOGOUT_TIME = :B1 , ROLE_LEVEL = :B6 , MONEY1 = :B5 , MONEY2 = :B4 , EXPERIENCE = :B3 WHERE LOGIN_ID = :B2 RETURNING SERVER_ID, (:B1 - LOGIN_TIME) * 800, LOGIN_IP, PROVINCE_CODE, CITY_CODE INTO :O0 ,:O1 ,:O2 ,:O3 ,:O4

session 1223:

1、UPDATE LOG_RECORD_DETAIL SET LOGOUT_TIME = :B1 , ROLE_LEVEL = :B6 , MONEY1 = :B5 , MONEY2 = :B4 , EXPERIENCE = :B3 WHERE LOGIN_ID = :B2 RETURNING SERVER_ID, (:B1 - LOGIN_TIME) * 800, LOGIN_IP, PROVINCE_CODE, CITY_CODE INTO :O0 ,:O1 ,:O2 ,:O3 ,:O4

2、SELECT D.FIRST_LOGIN_TIME, D.ONLINE_SECOND_TOTAL, D.OFFLINE_SECOND_TOTAL, D.USER_COUNT FROM LOG_RECORD_IDCARD D WHERE GAME_ID = :B2 AND ID_CODE = :B1 FOR UPDATE

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com