1. 现场环境的异常如下:
org.springframework.dao.DeadlockLoserDataAccessException:
SqlMapClient operation; SQL [];
--- The error occurred in
com/broada/srvmonitor/dao/ibatis/maps/oracle/MonitorResource.xml.
--- The error occurred while applying a parameter map.
--- Check the
MonitorResource.removeMonitorResource-InlineParameterMap.
--- Check the statement (update failed).
--- Cause: java.sql.SQLException: ORA-00060: 等待资源时检测到死锁
; nested exception is
com.ibatis.common.jdbc.exception.NestedSQLException:
--- The error occurred in com/broada/srvmonitor/dao/ibatis/maps/oracle/MonitorResource.xml.
--- The error occurred while applying a parameter map.
--- Check the
MonitorResource.removeMonitorResource-InlineParameterMap.
--- Check the statement (update failed).
--- Cause: java.sql.SQLException: ORA-00060: 等待资源时检测到死锁
2.找到com/broada/srvmonitor/dao/ibatis/maps/oracle/MonitorResource.xml
得出结论是表锁定 ,跟SM_RESOURCE表有关
3.通过pl/sql获取SM_RESOURCE的表设计
从上面的SM_RESOURCE的表设计可以看到该表有一个主键和两个外键,因为可以推断出此表死锁的两种情况
A情况 SM_RESOURCE表死锁了
SM_RESOURCE有两个外键,如图
可以得出该表是另外两个表的从表,当另外两个表中的其中一个表进行DML操作时,就会锁定SM_RESOURCE表,所以当bcc删除检测器,需要对SM_RESOURCE表进行操作的时候,此时就要等待其他主表对它释放,如果那个主表不释放SM_RESOURCE,就会导致死锁。
B情况. SM_RESOURCE 的从表被锁定
根据上图,可以得出,主表SM_RESOURCE有五个从表
当bcc删除检测器,对SM_RESOURCE表进行操作的时候,
SM_RESOURCE表先会锁定五个从表,如果这五个从表的其中一个表被其他表占用 ,那么就会等待其他表释放资源,如果其他表占着不放,就导致死锁。
4. 解决方案:在外键上添加索引
6月22日,解决了A情况,SM_RESOURCE表的两个外键添加了索引,结果现场出现了假死现象(阻塞情况),接着6月25日把SM_RESOURCE表的从表的外键都加了索引,终于解决了问题,删除检测器没有报错。
主表操作时,会锁定从表进行检查
没索引的话会对从表全表锁定
有索引的话会行锁定
分享到:
相关推荐
* ORA-00060: 等待资源时检测到死锁 * ORA-00061: 另一个例程设置了不同的 DML_LOCKS * ORA-00062: 无法获得 DML 全表锁定;DML_LOCKS 为 0 * ORA-00063: 超出 LOG_FILES 的最大数 * ORA-00064: 对象过大以至无法...
ORA-00059:等待资源时检测到死锁 ORA-00060:另一个例程设置了不同的 DML_LOCKS ORA-00061:无法获得 DML 全表锁定;DML_LOCKS 为 0 日志管理错误 ORA-00062:超出 LOG_FILES 的最大数 ORA-00063:对象过大以至...
ORA-00060: 等待资源时检测到死锁 ORA-00061: 另一个例程设置了不同的 DML_LOCKS ORA-00062: 无法获得 DML 全表锁定;DML_LOCKS 为 0 ORA-00063: 超出 LOG_FILES 的最大数 ORA-00064: 对象过大以至无法分配在此 O/S ...
在处理Oracle数据库时,我们经常遇到错误代码ORA-00031,它表明指定的会话已经被标记为终止。这个错误通常与数据库锁定和会话管理有关。本文将详细解析这一问题的解决方案,并提供一系列SQL语句和命令来处理和解决...
- ORA-00060: 等待资源时检测到死锁。在多用户环境中,当两个或多个事务相互等待对方释放资源时,就可能发生死锁。Oracle数据库会检测到死锁并回滚其中一个或多个事务,以解决死锁状态。 - ORA-00061: 另一个例程...
#### ORA-00060: 等待资源时检测到死锁 当两个或多个进程相互等待对方释放资源时触发。 #### ORA-00061: 另一个例程设置了不同的DML_LOCKS 当两个或多个例程尝试设置不同的DML_LOCKS时触发。 #### ORA-00062: 无法...
- `java.sql.SQLException: ORA-00060: deadlock detected while waiting for resource`: 两个或多个事务因相互等待对方释放资源而陷入死锁。通过死锁检测工具或优化事务处理逻辑来解决。 9. **权限问题** - `...
##### ORA-00060: 等待资源时检测到死锁 - **描述**:两个或多个事务互相等待对方释放资源而无法继续执行。 - **解决方法**: - 使用`DBMS_DEADLOCK`包提供的函数来处理死锁。 - 调整事务隔离级别以减少死锁的可能...
死锁是当多个事务在等待其他事务释放资源时,导致系统无法继续执行的现象。 在Oracle数据库中,死锁可能是由多种原因引起的,例如资源竞争、锁定冲突、事务延迟等。为了解决死锁问题,需要使用PL/SQL语句来检测和...
34. ORA-00060: 等待资源时检测到死锁,这可能需要进行死锁分析和解决。 以上只是Oracle错误代码的一部分,每个错误代码都提供了关于数据库运行状况、资源限制、权限问题以及操作错误等方面的信息。理解和解决这些...
34. ORA-00060: 等待资源时检测到死锁,这需要分析并解决并发操作的问题。 35. ORA-00061: 另一个例程设置了不同的DML_LOCKS,可能涉及到并发控制的冲突。 36. ORA-00062: 无法获得全表DML锁定,因为DML_LOCKS为0...
38. ORA-00060: 等待资源时检测到死锁 系统检测到两个或更多会话之间存在资源争用,导致死锁。 39. ORA-00061: 另一个实例设置了不同的 DML_LOCKS 另一个Oracle实例设置了不同的DML锁配置。 40. ORA-00062: 无法...
- 检测到等待资源时发生了死锁。这是由于两个或多个进程相互等待对方释放资源导致的。解决死锁的方法包括调整锁定顺序、优化事务逻辑等。 8. **ORA-00056: object with given name exists** - 给定名称的对象已...
34. **ORA-00060: 等待资源时检测到死锁:** 两个或多个会话互相等待对方释放资源,形成死锁。 35. **ORA-00061: 另一个例程设置了不同的 DML_LOCKS:** 两个例程间的DML_LOCKS设置不一致,导致冲突。 36. **ORA-...
#### ORA-00060: 等待资源时检测到死锁 在等待资源的过程中发现了一个死锁情况,通常需要回滚某个事务或优化锁的使用。 #### ORA-00061: 另一个例程设置了不同的DML_LOCKS 在并发的DML操作中,另一个会话修改了DML_...
ORA-00060:等待资源时检测到死锁 死锁是两个或多个进程在执行过程中因竞争资源而造成的一种僵局。当检测到死锁时,Oracle会回滚一个事务来释放资源,从而使其他事务可以继续执行。避免死锁的常见做法是合理设计事务...
**ORA-00060: 等待资源时检测到死锁** - **描述**: 多个会话互相等待对方释放资源而形成的死锁情况。 - **解决方法**: 使用死锁检测工具或调整事务隔离级别以减少死锁的发生。 **ORA-00061: 另一个例程设置了不同的...