环境: DB: ORACLE 10.2 OS : RHEL 4
SQL> show user;
USER 为 "SCOTT"
SQL> select * from deptbak;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> set autocommit off;
SQL> update deptbak set deptno=44 where deptno=40;
已更新 1 行。
=====================================
此时再打开另一个sqlplus,进行如下操作:
[oracle@localhost ~]$ sqlplus / as sysdba
SQL> show user;
USER 为 "SYS"
SQL> set autocommit off
SQL> select * from scott.deptbak;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> update scott.deptbak set deptno=33 where deptno=30;
已更新 1 行。
===================================
回到第一个sqlplus中执行如下语句:
SQL> update deptbak set deptno=31 where deptno=30;
此时此会话将会一直阻塞,因为它得不到第二个会话持有的这一行的排他锁.
===================================
再回到第二个sqlplus中,执行如下语句:
SQL> update scott.deptbak set deptno=41 where deptno=40;
update scott.deptbak set deptno=41 where deptno=40
*
第 1 行出现错误:
ORA-00060: 等待资源时检测到死锁
!!!!!!!!!!!!!!!!!!!!!!!这里系统自动地检测出了死锁,这时需要我们人为地提交事务!!!!
SQL> commit;
提交完成。
查询下数据:
SQL> select * from scott.deptbak;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
33 SALES CHICAGO
40 OPERATIONS BOSTON
======================================
第二个会话提交完成后,第一个会话将不再阻塞,显示如下:
SQL> update deptbak set deptno=31 where deptno=30;
已更新0行。!!!!!!!!!!!!!!!!!!!!!!! 注意 : 没有更新本行,为什么???(稍后说明)!!!!!!!!!!!!!!!!!!!!!!
再来查询一下数据
SQL> select * from deptbak;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
33 SALES CHICAGO
44 OPERATIONS BOSTON
特别说明:
第一个会话的第二条更新没有生效,原因是更新时有"一致读"和"当前读",
当发现数据当前读和一致读不相同时,oracle就知道此数据已经由别人
修改了,这条数据不再是之前想修改的数据了,为了避免出现问题,将
不进行更新.
更详细的解释,参考Kyte的书的相关章节.
分享到:
相关推荐
oracle死锁问题查询代码,仅供参考,有问题大家一起交流
java oracle 死锁 解锁 进程 SQL
BLOG_Oracle_lhr_Oracle死锁的分类及其模拟.pdfBLOG_Oracle_lhr_Oracle死锁的分类及其模拟.pdf
有效关闭Oracle死锁进程,和释放状态为killed的session
oracle死锁表后处理,oracle死锁表后处理
oracle死锁及连接数监测
oracle死锁故障分析和诊断解决~~~~~~~~~
oracle查询死锁语句,并能根据根据ID值杀死锁表的进程!
编译的存储过程的时候,程序死住,等待一会出现ora-04021错误解决办法。文档中有查询思索的语句,以及杀掉死锁进程的方法。
提供了处理oracle死锁的详细oracle死锁语句,包括对死锁的定位,查找死锁的进程,kill掉死锁的进程,
OracleOracle查询死锁表OracleOracle查询死锁表OracleOracle查询死锁表
oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁
查询ORACLE死锁以及解锁语句查询ORACLE死锁以及解锁语句
Oracle 死锁处理 Oracle 死锁处理 Oracle 死锁处理 Oracle 死锁处理 Oracle 死锁处理
oracle死锁问题一直困扰着我们,下面就教您一个oracle死锁的检查方法,如果您之前遇到过oracle死锁方面的问题,不妨一看。
查看 oracle 死锁程序 本程序可轻松查看oracle数据库是否有表锁死
在任何数据库中发生死锁都是不愉快的,即使是在一个特殊的情况下发生也是如此,它们会减小应用程序的接受程度(ACCEPTANCE),因此避免并正确解释死锁是非常重要的。
一、数据库死锁的现象 程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。 二、死锁的原理 当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提 交,另一条对于这一列...
解决Oracle数据库死锁问题,查询出数据库所有死锁,并杀死所有的死锁,解决程序运行问题;
Oracle数据库死锁问题研究.pdf