我正在使用多个客户端测试一个应用程序。在某种程度上,我在数据库中出现了一个死锁。我得到了以下痕迹:
由: com.indra.davinci.common.dataaccess.DataAccessException: SQL:从EMPLOYEE WHERE DEPT_ID IN中删除(从其中选择ID COMPANY_ID = ?),参数:409386
和
由: java.sql.SQLException: ORA-00060引起:等待资源时检测到死锁
表EMPLOYEE有两个子表(经理和开发人员),它们都带有EMPLOYEE的外键。我已经为外键创建了索引。对级联的删除未设置。另一方面,应用程序的代码执行以下操作: 1.删除子表管理器中属于具体雇员的行。2.删除子表开发人员中属于具体雇员的行。3.删除EMPLOYEE表中的行。4.删除DPTO表中的行(EMPLOYEE是DPTO的子级,有一个外键和创建的索引)。
为了获得请求的性能顺序,我在应用程序中设置了跟踪,并看到以下内容:
06/09/2017 08:43:13.539 INIT删除经理客户端: 409383
06/09/2017 08:43:13.539 INIT删除经理客户端: 409386
06/09/2017 08:43:13.555最后删除经理客户端: 409386
06/09/2017 08:43:13.555 INIT删除开发人员客户端: 409386
06/09/2017 08:43:13.555最后删除经理客户端: 409383
06/09/2017 08:43:13.555 INIT删除开发人员客户端: 409383
06/09/2017 08:43:13.555最后删除开发者客户端: 409386
06/09/2017 08:43:13.555 INIT删除雇员客户端: 409386
06/09/2017 08:43:13.555最后删除开发者客户端: 409383
06/09/2017 08:43:13.555 INIT删除雇员客户端: 409383
06/09/2017 08:43:13.555 INIT删除经理客户端: 409389
06/09/2017 08:43:13.570 INIT删除经理客户端: 409407
06/09/2017 08:43:13.570最后删除经理客户端: 409389
06/09/2017 08:43:13.570 INIT删除开发人员客户端: 409389
06/09/2017 08:43:13.570最后删除开发者客户端: 409389
06/09/2017 08:43:13.570 INIT删除雇员客户端: 409389
06/09/2017 08:43:13.570最后删除经理客户端: 409407
06/09/2017 08:43:13.570 INIT删除开发人员客户端: 409407
06/09/2017 08:43:13.570最后删除开发者客户端: 409407
06/09/2017 08:43:13.570 INIT删除雇员客户端: 409407
现在看来,在08:43:13.555,两个客户端正在尝试从EMPLOYEE表中删除。
我从Oracle获得跟踪文件中的以下内容:
Trace file C:\ORACLEXE\APP\ORACLE\diag\rdbms\xe\xe\trace\xe_ora_10068.trc
Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production
Windows NT Version V6.1 Service Pack 1
CPU : 4 - type 586, 2 Physical Cores
Process Affinity : 0x0x00000000
Memory (Avail/Total): Ph:2347M/16247M, Ph+PgF:15271M/32493M, VA:2685M/4095M
Instance name: xe
Redo thread mounted by this instance: 1
Oracle process number: 36
Windows thread id: 10068, image: ORACLE.EXE (SHAD)
*** 2017-09-06 08:43:16.613
*** SESSION ID:(11.369) 2017-09-06 08:43:16.613
*** CLIENT ID:() 2017-09-06 08:43:16.613
*** SERVICE NAME:(XE) 2017-09-06 08:43:16.613
*** MODULE NAME:(JDBC Thin Client) 2017-09-06 08:43:16.613
*** ACTION NAME:() 2017-09-06 08:43:16.613
*** 2017-09-06 08:43:16.613
DEADLOCK DETECTED ( ORA-00060 )
[Transaction Deadlock]
The following deadlock is not an ORACLE error. It is a
deadlock due to user error in the design of an application
or from issuing incorrect ad-hoc SQL. The following
information may aid in determining the deadlock:
Deadlock graph:
---------Blocker(s)-------- ---------Waiter(s)---------
Resource Name process session holds waits process session holds waits
TM-0008747d-00000000 36 11 SX SSX 32 10 SX SSX
TM-0008747d-00000000 32 10 SX SSX 36 11 SX SSX
session 11: DID 0001-0024-00000114 session 10: DID 0001-0020-0000001C
session 10: DID 0001-0020-0000001C session 11: DID 0001-0024-00000114
Rows waited on:
Session 11: no row
Session 10: no row
----- Information for the OTHER waiting sessions -----
Session 10:
sid: 10 ser: 27 audsid: 14562964 user: 184/USRPLNADIF
flags: (0x41) USR/- flags_idl: (0x1) BSY/-/-/-/-/-
flags2: (0x40009) -/-
pid: 32 O/S info: user: SYSTEM, term: MARRIETAW7, ospid: 13724
image: ORACLE.EXE (SHAD)
client details:
O/S info: user: marrieta, term: unknown, ospid: 1234
machine: marrietaw7 program: JDBC Thin Client
application name: JDBC Thin Client, hash value=2546894660
current SQL:
DELETE FROM EMPLOYEE WHERE DEPT_ID IN (SELECT ID FROM DPTO WHERE COMPANY_ID = :1)
----- End of information for the OTHER waiting sessions -----
Information for THIS session:
----- Current SQL Statement for this session (sql_id=6v66dbfh41hbx) -----
DELETE FROM EMPLOYEE WHERE DEPT_ID IN (SELECT ID FROM DPTO WHERE COMPANY_ID = :1)对会发生什么有什么想法吗?
谢谢。
发布于 2017-09-06 10:31:00
我检查了跟踪文件中的死锁图,具体如下:
Deadlock graph:
---------Blocker(s)-------- ---------Waiter(s)---------
Resource Name process session holds waits process session holds waits
TM-0008747d-00000000 36 11 SX SSX 32 10 SX SSX
TM-0008747d-00000000 32 10 SX SSX 36 11 SX SSX我将十六进制0008747d转换为十进制,并执行以下操作:
从dba_objects中选择* object_id= 554109;
我找到了一张阻止数据库的表格。这个表不是应用程序使用的,而是在数据库中创建的(可能是在应用程序的旧版本中创建的),我发现这个表是EMPLOYEE的子表,没有FK的索引。我要试着解决这个问题,我会发表意见的。
https://stackoverflow.com/questions/46071460
复制相似问题