java deadlock oracle_【DEADLOCK】Oracle“死锁”模拟
本着实验优先的原则,先模拟死锁的发生,然后在列一下死锁产生的四个必要条件和处理死锁的一般策略。1.创建两个简单的表t1_deadlock和t2_deadlock,每个表中仅仅包含一个字段asys@ora10g> conn sec/secConnected.sec@ora10g> create table t1_deadlock (a int);Table created.sec@ora10g> create table t2_deadlock (a int);Table created.2.每张表中仅初始化一条数据sec@ora10g> insert into t1_deadlock values (1);1 row created.sec@ora10g> insert into t2_deadlock values (2);1 row created.sec@ora10g> commit;Commit complete.3.在第一个会话session1中更新表t1_deadlock中的记录“1”为“1000”,不进行提交sec@ora10g> update t1_deadlock set a = 1000 where a = 1;1 row updated.4.在第二个会话session2中更新表t2_deadlock中的记录“2”为“2000”,不进行提交sec@ora10g> update t2_deadlock set a = 2000 where a = 2;1 row updated.5.此时,没有任何问题发生。OK,现在注意一下下面的现象,我们再回到会话session1中,更新t2_deadlock的记录sec@ora10g> update t2_deadlock set a = 2000 where a = 2;这里出现了“锁等待”(“阻塞”)的现象,原因很简单,因为在session2中已经对这条数据执行过这个操作,在session2中已经对该行加了行级锁。注意,这里是“锁等待”,不是“死锁”,注意这两个概念的区别!检测“锁等待”的方法曾经提到过,请参考《【实验】【LOCK】“锁等待”模拟、诊断及处理方法》http://space.itpub.net/519536/viewspace-605526sec@ora10g> @lock
lock lock
holder holder lock lock request blocked
username sessid SERIAL# type id1 id2 mode mode BLOCK sessid
-------- ------ ------- ------ ------ ---- ---- ------- ----- -------
SEC 141 6921 TM 15160 0 3 0 0
SEC 141 6921 TX 393231 1672 6 0 1 145
SEC 145 7402 TM 15159 0 3 0 0
SEC 145 7402 TM 15160 0 3 0 0
SEC 145 7402 TX 131077 1675 6 0 0
164 1 TS 3 1 3 0 0
165 1 CF 0 0 2 0 0
165 1 RS 25 1 2 0 0
165 1 XR 4 0 1 0 0
166 1 RT 1 0 6 0 0
167 1 PW 1 0 3 0 0
11 rows selected.6.我们关注的“死锁”马上就要隆重出场了:在会话session2中,更新t1_deadlock的记录(满足了死锁产生的四个条件了,请慢慢体会)sec@ora10g> update t1_deadlock set a = 1000 where a = 1;这里还是长时间等待的现象,但是这里发生了“死锁”!!细心的您再去第一个会话session1中看一下,原先一直在等待的SQL语句出现如下的现象:sec@ora10g> update t2_deadlock set a = 2000 where a = 2;update t2_deadlock set a = 2000 where a = 2*ERROR at line 1:ORA-00060: deadlock detected while waiting for resource更进一步:查看一下alert警告日志文件发现有如下的记录Mon Aug 10 11:24:29 2009ORA-00060: Deadlock detected. More info in file /oracle/app/oracle/admin/ora10g/udump/ora10g_ora_25466.trc.再进一步:看看系统自动生成的trace文件中记录了什么这个文件包含了5721行的记录信息,截取其中我们关心的前面N多行的内容(结合刚才检测“锁等待”脚本产生的结果分析一下,看看有没有收获):/oracle/app/oracle/admin/ora10g/udump/ora10g_ora_25466.trcOracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit ProductionWith the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine optionsORACLE_HOME = /oracle/app/oracle/product/10.2.0/db_1System name: LinuxNode name: testdbRelease: 2.6.18-53.el5xenVersion: #1 SMP Wed Oct 10 16:48:44 EDT 2007Machine: x86_64Instance name: ora10gRedo thread mounted by this instance: 1Oracle process number: 14Unix process pid: 25466, image: oracle@testdb (TNS V1-V3)*** 2009-08-10 11:24:29.541*** ACTION NAME:() 2009-08-10 11:24:29.540*** MODULE NAME:(SQL*Plus) 2009-08-10 11:24:29.540*** SERVICE NAME:(SYS$USERS) 2009-08-10 11:24:29.540*** SESSION ID:(145.7402) 2009-08-10 11:24:29.540DEADLOCK DETECTED[Transaction Deadlock]Current SQL statement for this session:update t2_deadlock set a = 2000 where a = 2The following deadlock is not an ORACLE error. It is adeadlock due to user error in the design of an applicationor from issuing incorrect ad-hoc SQL. The followinginformation may aid in determining the deadlock:Deadlock graph:---------Blocker(s)-------- ---------Waiter(s)---------Resource Name process session holds waits process session holds waitsTX-00020005-0000068b 14 145 X 15 141 XTX-0006000f-00000688 15 141 X 14 145 Xsession 145: DID 0001-000E-0000037D session 141: DID 0001-000F-0000013Dsession 141: DID 0001-000F-0000013D session 145: DID 0001-000E-0000037DRows waited on:7.以上种种现象说明什么?说明:Oracle对于“死锁”是要做处理的,而不是采用下面提到的“鸵鸟算法”不闻不问。注意trace文件中的一行如下提示信息,说明一般情况下都是应用和人为的,和Oracle同学没有关系:The following deadlock is not an ORACLE error. It is adeadlock due to user error in the design of an applicationor from issuing incorrect ad-hoc SQL.8.以上演示了一种“死锁”现象的发生,当然导致死锁发生的情况远远不仅如此。所以在程序设计时一定要好好的进行思考9.【拓展】死锁产生的四个必要条件1)Mutual exclusion(互斥):资源不能被共享,只能由一个进程使用。2)Hold and wait(请求并保持):已经得到资源的进程可以再次申请新的资源。3)No pre-emption(不可剥夺):已经分配的资源不能从相应的进程中被强制地剥夺。4)Circular wait(循环等待条件):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。处理死锁的一般策略1)鸵鸟算法忽略该问题2)检测死锁并且恢复3)仔细地对资源进行动态分配,以避免死锁4)通过破坏死锁产生呢过的四个必要条件之一,来防止死锁产生10.总结死锁对于数据库来说是非常要命的,请多多注意!对于上面的演示处理的方式:在会话session1中执行rollback进行回滚,会释放导致session2锁等待的锁资源(死锁Oracle已经处理了)。Good luck.secooler11.10.22-- The End --
java deadlock oracle_【DEADLOCK】Oracle“死锁”模拟相关推荐
- Oracle“死锁”模拟
本着实验优先的原则,先模拟死锁的发生,然后在列一下死锁产生的四个必要条件和处理死锁的一般策略. 1.创建两个简单的表t1_deadlock和t2_deadlock,每个表中仅仅包含一个字段a sys@ ...
- oracle死锁模拟,Oracle死锁的模拟和处理
一,什么是死锁 A deadlock is a situation in which two or more users are waiting for data locked by each oth ...
- 14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例
14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例下面的例子演示了一个错误可以发生当一个lock 请求会导致一个死锁,例子设计2个客户端,A和B:Jek ...
- Deadlock 和 Deadlock Prevention
一.Thread Deadlock A deadlock is when two or more threads are blocked waiting to obtain locks that so ...
- 关于Oracle死锁的知识点总结
源地址 : https://www.cnblogs.com/kerrycode/p/6928263.html 李华荣总结的死锁 1 BLOG文档结构图 wpsA550.tmp 2 前言部分 2.1 导 ...
- Oracle死锁问题: enq: TX - row lock contention
前言 这篇文章也是记录近期遇到的问题以及从中学到的知识 ,近期一直在救火,有些问题自认为还是挺有代表性的,有兴趣的话再继续向下看 问题现象 线上反馈,执行批量处理EXCEL数据时,系统一直卡在进度滚动 ...
- Java 并发编程中的死锁 ( Kotlin 语言讲解)
什么是死锁? 在操作系统中的并发处理场景中, 进程对资源的持有与请求过程中,会产生死锁. Say, Process A has resource R1 , Process B has resource ...
- mysql 死锁模拟_MySQL死锁
一.查看MySQL死锁 MySQL数据库会自己解决死锁,kill掉一个session的事务,让另外一个session的事务可以执行 SQL>SHOW ENGINE INNODB STATUS\G ...
- (JAVA)线程之lock和死锁(例)
package thread; import java.util.concurrent.locks.*;/*** @author Alina* @date 2021年12月20日 11:07 下午* ...
- 实战演练丨Oracle死锁案例分析,看完你就懂了
问题背景 发生Oracle死锁的多个进程执行的都是同一个存储过程,大概代码及顺序如下: --1.首先通过主键order_no锁住一条订单 select t.* from order t where t ...
最新文章
- 引进博士50万房补;硕士20万房补;本科15万房补
- dice系数 交叉熵_语义分割中的损失函数
- 线程池的 RejectedExecutionHandler(拒绝策略)
- 【UOJ】【BZOJ】 [Zjoi2016]小星星
- Codeforces Round #198 (Div. 2)A,B题解
- 求平均值 Avg.java
- IP组播之组管理协议IGMP
- 8.1 Zend_View(2)
- 2000-2019全国各省分品种能源消费量
- 苹果6能解掉id锁吗_iPhone进水保修吗?苹果官方正式回应了
- VMware安装Windows11专业版详细教程
- Codeforces C. Destroying Array
- UI设计师必备10大工具
- 【PAT甲级 - C++题解】1147 Heaps
- 骨龄预测系列---番外篇
- 【GZOI 1032G】腐败分子看直播(树)
- 数据结构与算法-Part6——数组与广义表
- android Gui系统之SurfaceFlinger(1)---SurfaceFlinger概论
- 【ESP8266点焊机】基于 ESP8266 for Arduino
- [windtalker]
热门文章
- Vue:axios中POST请求传参问题
- [原创]数据库视图介绍和使用
- sencha touch 2.0 学习记录
- 利用Matlab绘制图像中的某一行或者某一列的灰度曲线
- error C2668: “pow”: 对重载函数的调用不明确
- 【深度学习】卷积神经网络(Convolutional Neural Network)
- Python多线程(threading模块)
- leetcode刷题日记-供暖器
- python列表推导式使用
- 【劲峰论道时空分析技术-学习笔记】1 时空数据和时空变量时空过程和时空机理