- 浏览: 334270 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (198)
- HIBERNATE (8)
- JAVA (13)
- 数据库 (24)
- SPRING (1)
- LINUX (0)
- 需求管理 (3)
- 职业提升 (6)
- 团队建设 (1)
- 日常用到语句 (1)
- FLEX (6)
- 用户体验 (3)
- 设计模式 (6)
- weblogic (2)
- PowerDesigner (3)
- HTML (7)
- ANT (7)
- 工具. (1)
- bat (5)
- 存储过程 (1)
- strus2 (1)
- DWR (2)
- jfreechart (4)
- 上线测试优化 (17)
- JVM (9)
- 工具使用 (2)
- 算法 (3)
- 私事 (0)
- 数据库-Oracle session (1)
- 软件开发 (5)
- 产品 (2)
- 项目管理 (4)
- oracle语句 (1)
- IntelliJ IDEA (4)
- GRAILS (10)
- Groovy (1)
- JS (1)
- DUBBO (1)
- JAVA EXCEL (3)
- netty websocket (1)
- kafka (1)
- 秘钥体系 (2)
- golang (6)
- gradle (1)
- spring cloud (0)
最新评论
-
wujt:
...
Grails_数据库逆向工程插件 db-reverse-engineer -
yy8093:
我也遇到这个问题,不过并不觉得是个好的方法。。。。不过最后也确 ...
关于dubbo服务产生异常之:Caused by: com.alibaba.dubbo.remoting.TimeoutException: Waiting s -
wujt:
# ----- Execute The Requested C ...
jconsole基础配置(原创) -
gaowei52306:
你好,请问remotedir="/home/dmwe ...
Ant FTP -
抢街饭:
ant生成日志 在命令行也能看见 怎么去做啊
ant生成日志
数据库阻塞和死锁的区别(转载)
数据库阻塞和死锁在程序开发过程经常出现,怎么样避免呢?下面通过Demo简单模拟下,数据库发生阻塞和死锁的现象:
一、数据库阻塞:
数据库阻塞的现象:第一个连接占有资源没有释放,而第二个连接需要获取这个资源。如果第一个连接没有提交或者回滚,
第二个连接会一直等待下去,直到第一个连接释放该资源为止。对于阻塞,数据库无法处理,所以对数据库操作要及时地提交或
者回滚。
Demo:
--创建表
create table tb(id int,createtime date);
--插入测试数据
insert into tb select 1,sysdate from dual;
insert into tb select 2,sysdate from dual;
insert into tb select 3,sysdate from dual;
commit;
第一个连接,不提交或者回滚:
SQL> update tb set id=2 where id=1;
1 row updated
第二个连接,一直在运行:
SQL> update tb set id=2 where id=1;
因为第一个连接占有tb表没有释放资源,而第二个连接一直在等待第一个连接释放该资源。
二、数据库死锁:
数据库死锁的现象:第一个连接占有资源没有释放,准备获取第二个连接所占用的资源,而第二个连接占有资源没有释放,
准备获取第一个连接所占用的资源。这种互相占有对方需要获取的资源的现象叫做死锁。对于死锁,数据库处理方法:牺牲一个
连接,保证另外一个连接成功执行。
Demo:
--创建测试表t1
create table t1(id int,createtime date);
insert into t1 select 1,sysdate from dual;
insert into t1 select 2,sysdate from dual;
insert into t1 select 3,sysdate from dual;
commit;
--创建测试表t2
create table t2(id int,createtime date);
insert into t2 select 1,sysdate from dual;
insert into t2 select 2,sysdate from dual;
insert into t2 select 3,sysdate from dual;
commit;
第一个连接,在command窗口中运行:
begin
--先修改t1
update t1 set id=2
where id=1;
--等待20s
dbms_lock.sleep(20);
--再修改t2
update t2 set id=2
where id=1;
end;
/
运行结果:
ORA-00060: 等待资源时检测到死锁
ORA-06512: 在 line 9
第二个连接:
begin
--先修改t2
update t2 set id=2
where id=1;
--等待20s
dbms_lock.sleep(20);
--再修改t1
update t1 set id=2
where id=1;
end;
/
运行结果:
PL/SQL procedure successfully completed
因为第一个连接占有表t1,想要获取表t2的资源,而第二个连接占有表t2,想要获取表t1的资源,这种互相占有对方想要获取的资
源,满足死锁现象。最后第一个连接报异常退出,而第二个连接执行成功。
------------------------------------------------------
死锁所在的资源和检测:
在SQL Server的两个或多个任务中,如果某个任务锁定了其他任务试图锁定的资源。会造成这些任务的永久阻塞,从而出现死锁。
下图为例:
l 事务T1获得了行R1的共享锁。
l 事务T2获得了行R2的共享锁。
l 然后事务T1请求行R2的排它锁,但是T2完成并释放其对R2的共享锁之前被阻塞。
l T2请求行R1的排它锁,但是事务T1完成并释放其对R1持有的共享锁之前被阻塞。
现在T2与T1相互等待,导致了死锁。一般情况下监视器会自动检测并解决这个问题。
可以发生死锁的资源:
死锁不仅仅发生在锁资源上面,还会发生在一下资源上:
l 锁。例如页、行、元数据和应用程序上的锁。
l 工作线程。如果排队等待线程的任务拥有阻塞所有其他工作线程的资源,也会导致死锁。
l 内存。当并发请求等待获得内存,而当前的可用内存无法满足其需要时,可能发生死锁。
l 并行查询执行的相关资源。当一个语句用到多个线程运行时,线程之间有可能发生死锁。
死锁检测:
默认5秒钟搜索SQL Server中的所有任务,检测是否有死锁。如果有,将选择一个作为牺牲品,并返回1205错误。一般是开销最小的事务作为牺牲品。
死锁与阻塞的差别:
阻塞:当一个事务请求一个被其他事务锁定的资源上的锁时,发出请求的事务会一直等待下去,知道该锁被别人释放,自己能申请到位置。
默认情况下除非设置了LOCK_TIMEOUT,否则事务会一直等待下去。
死锁:两个或多个进程之间的相互等待。但是由于SQL Server有数据库引擎死锁检测方案,至少5秒钟会消除一个现有的死锁。对性能的影响往往没有阻塞严重。
问题定位:
1、 跟踪标志1204和跟踪标志1222:
打开跟踪的语句:
DBCC TRACEON(1222,-1)
DBCC TRACEON(1204,-1)
对于1222产生的结果解释:
1、 死锁牺牲的进程:第一句deadlockvictim=processXXXX,中的xxxx就是死锁牺牲品。
2、 死锁发生的进程信息:第二部分的process-list
3、 发生死锁的资源信息:在结果的resource-list中
4、 死锁图形事件:
从sqlserver profiler中得到,一般结合1222跟踪标志和sql trace。
首先从errorlog中寻找1222的输出结果,根据输出的时间在跟踪里找到相应的连接。然后分析原因。
解决办法:
尽管死锁不能完全避免,但是可以把机会降到最低:
l 按同一顺序访问对象。
l 避免事务中的用户交互。
l 保持事务简短并处于一个批处理中。
l 使用脚底的隔离级别。
l 调整语句的执行计划,减少锁的申请数目。
按同一顺序访问对象:
如果所有并发事务按同一顺序访问对象,则发生死锁的可能性会降低。
避免事务中的用户交互:
避免编写包含用户交互的事务,因为没有用户干预的批处理的运行速度远快于必须等待用户响应时的查询速度。
保持事务简短并处于一个批处理中:
运行时间越长,等待时间就越长,造成死锁的机会就越高。
使用脚底的隔离级别:
确定事务能否在低隔离级别上运行。尽可能使用较低的隔离级别。
调整语句的执行计划,减少锁的申请数目:
可以从执行计划中找出哪些资源耗得比较多。此时锁的数目也会相应增多。
转自 http://blog.chinaunix.net/uid-26565070-id-3337614.html
数据库阻塞和死锁在程序开发过程经常出现,怎么样避免呢?下面通过Demo简单模拟下,数据库发生阻塞和死锁的现象:
一、数据库阻塞:
数据库阻塞的现象:第一个连接占有资源没有释放,而第二个连接需要获取这个资源。如果第一个连接没有提交或者回滚,
第二个连接会一直等待下去,直到第一个连接释放该资源为止。对于阻塞,数据库无法处理,所以对数据库操作要及时地提交或
者回滚。
Demo:
--创建表
create table tb(id int,createtime date);
--插入测试数据
insert into tb select 1,sysdate from dual;
insert into tb select 2,sysdate from dual;
insert into tb select 3,sysdate from dual;
commit;
第一个连接,不提交或者回滚:
SQL> update tb set id=2 where id=1;
1 row updated
第二个连接,一直在运行:
SQL> update tb set id=2 where id=1;
因为第一个连接占有tb表没有释放资源,而第二个连接一直在等待第一个连接释放该资源。
二、数据库死锁:
数据库死锁的现象:第一个连接占有资源没有释放,准备获取第二个连接所占用的资源,而第二个连接占有资源没有释放,
准备获取第一个连接所占用的资源。这种互相占有对方需要获取的资源的现象叫做死锁。对于死锁,数据库处理方法:牺牲一个
连接,保证另外一个连接成功执行。
Demo:
--创建测试表t1
create table t1(id int,createtime date);
insert into t1 select 1,sysdate from dual;
insert into t1 select 2,sysdate from dual;
insert into t1 select 3,sysdate from dual;
commit;
--创建测试表t2
create table t2(id int,createtime date);
insert into t2 select 1,sysdate from dual;
insert into t2 select 2,sysdate from dual;
insert into t2 select 3,sysdate from dual;
commit;
第一个连接,在command窗口中运行:
begin
--先修改t1
update t1 set id=2
where id=1;
--等待20s
dbms_lock.sleep(20);
--再修改t2
update t2 set id=2
where id=1;
end;
/
运行结果:
ORA-00060: 等待资源时检测到死锁
ORA-06512: 在 line 9
第二个连接:
begin
--先修改t2
update t2 set id=2
where id=1;
--等待20s
dbms_lock.sleep(20);
--再修改t1
update t1 set id=2
where id=1;
end;
/
运行结果:
PL/SQL procedure successfully completed
因为第一个连接占有表t1,想要获取表t2的资源,而第二个连接占有表t2,想要获取表t1的资源,这种互相占有对方想要获取的资
源,满足死锁现象。最后第一个连接报异常退出,而第二个连接执行成功。
------------------------------------------------------
死锁所在的资源和检测:
在SQL Server的两个或多个任务中,如果某个任务锁定了其他任务试图锁定的资源。会造成这些任务的永久阻塞,从而出现死锁。
下图为例:
l 事务T1获得了行R1的共享锁。
l 事务T2获得了行R2的共享锁。
l 然后事务T1请求行R2的排它锁,但是T2完成并释放其对R2的共享锁之前被阻塞。
l T2请求行R1的排它锁,但是事务T1完成并释放其对R1持有的共享锁之前被阻塞。
现在T2与T1相互等待,导致了死锁。一般情况下监视器会自动检测并解决这个问题。
可以发生死锁的资源:
死锁不仅仅发生在锁资源上面,还会发生在一下资源上:
l 锁。例如页、行、元数据和应用程序上的锁。
l 工作线程。如果排队等待线程的任务拥有阻塞所有其他工作线程的资源,也会导致死锁。
l 内存。当并发请求等待获得内存,而当前的可用内存无法满足其需要时,可能发生死锁。
l 并行查询执行的相关资源。当一个语句用到多个线程运行时,线程之间有可能发生死锁。
死锁检测:
默认5秒钟搜索SQL Server中的所有任务,检测是否有死锁。如果有,将选择一个作为牺牲品,并返回1205错误。一般是开销最小的事务作为牺牲品。
死锁与阻塞的差别:
阻塞:当一个事务请求一个被其他事务锁定的资源上的锁时,发出请求的事务会一直等待下去,知道该锁被别人释放,自己能申请到位置。
默认情况下除非设置了LOCK_TIMEOUT,否则事务会一直等待下去。
死锁:两个或多个进程之间的相互等待。但是由于SQL Server有数据库引擎死锁检测方案,至少5秒钟会消除一个现有的死锁。对性能的影响往往没有阻塞严重。
问题定位:
1、 跟踪标志1204和跟踪标志1222:
打开跟踪的语句:
DBCC TRACEON(1222,-1)
DBCC TRACEON(1204,-1)
对于1222产生的结果解释:
1、 死锁牺牲的进程:第一句deadlockvictim=processXXXX,中的xxxx就是死锁牺牲品。
2、 死锁发生的进程信息:第二部分的process-list
3、 发生死锁的资源信息:在结果的resource-list中
4、 死锁图形事件:
从sqlserver profiler中得到,一般结合1222跟踪标志和sql trace。
首先从errorlog中寻找1222的输出结果,根据输出的时间在跟踪里找到相应的连接。然后分析原因。
解决办法:
尽管死锁不能完全避免,但是可以把机会降到最低:
l 按同一顺序访问对象。
l 避免事务中的用户交互。
l 保持事务简短并处于一个批处理中。
l 使用脚底的隔离级别。
l 调整语句的执行计划,减少锁的申请数目。
按同一顺序访问对象:
如果所有并发事务按同一顺序访问对象,则发生死锁的可能性会降低。
避免事务中的用户交互:
避免编写包含用户交互的事务,因为没有用户干预的批处理的运行速度远快于必须等待用户响应时的查询速度。
保持事务简短并处于一个批处理中:
运行时间越长,等待时间就越长,造成死锁的机会就越高。
使用脚底的隔离级别:
确定事务能否在低隔离级别上运行。尽可能使用较低的隔离级别。
调整语句的执行计划,减少锁的申请数目:
可以从执行计划中找出哪些资源耗得比较多。此时锁的数目也会相应增多。
转自 http://blog.chinaunix.net/uid-26565070-id-3337614.html
发表评论
-
在oracle10g中如何恢复drop掉的表
2014-11-19 15:17 767在oracle10g中如何恢复drop掉的表 在oracl ... -
左关联右关联全关联
2014-11-10 17:06 3852左关联右关联全关联 参考:http://www.cn ... -
win8系统倒入数据imp-00058错误
2014-09-21 17:52 664win8系统倒入数据imp-00058错误 ... -
oracle中如何判断字符串是否全为数字,以及从任意字符串中提取数字
2013-12-18 13:09 1474本文介绍了判断字符串是否全为数字的4种办法,另外还介绍了一个t ... -
查询闪存
2013-12-17 09:36 741(1)查询目标表30分钟前的数据 select * from ... -
ORA-00031: session marked for kill 处理Oracle中杀不掉的锁
2013-08-16 13:35 699ORA-00031: session marked for k ... -
Oracle创建表空间、创建用户以及授权
2013-07-30 11:30 680Oracle创建表空间、创建用户以及授权 创建临时表空间 创 ... -
Oracle中诊断阻塞session的方法 blocking error
2014-10-22 11:36 677Oracle中诊断阻塞session的方法 blocking ... -
查询Oracle中的阻塞锁(以及阻塞在哪个数据上)的SQL
2013-01-19 13:58 0查询Oracle中的阻塞锁(以及阻塞在哪个数据上)的SQL 数 ... -
查询Oracle中的阻塞锁(以及阻塞在哪个数据上)的SQL
2013-01-19 13:57 2601查询Oracle中的阻塞锁(以及阻塞在哪个数据上)的SQL 数 ... -
ORACLE阻塞
2013-01-19 13:56 882ORACLE阻塞 案例一: 34.//SYS窗口 35. ... -
oracle 死锁和锁等待的区别(转载)
2013-01-19 13:27 1291oracle 死锁和锁等待的区别(转载) 所谓的锁等待:就是 ... -
关于“ORA-00060:等待资源时检测到死锁”问题的分析(转载)
2013-01-19 13:26 1314关于“ORA-00060:等待资源时检测到死锁”问题的分析(转 ... -
查询Oracle正在执行和执行过的SQL语句
2013-01-18 22:55 0查询Oracle正在执行和执行过的SQL语句 ---正在执 ... -
如何检测被锁住的Oracle存储过程(转帖)
2013-01-18 17:39 837如何检测被锁住的Oracle存储过程(转帖) 1.查看是哪 ... -
Oracle死锁的处理
2013-01-18 17:29 710Oracle死锁的处理 Oracle死锁问题应该如何解决呢?可 ... -
oracle 查询所有表的记录数 SQL
2013-01-18 15:06 1247oracle 查询所有表的记录数 SQL create o ... -
oracle enterprise manager console 出现 ora-12154:TNS:无法处理的服务名
2011-11-27 20:23 1163登录oracle enterprise manager con ... -
启动服务报错ORA-12505
2011-10-25 18:23 1435今天在工作中配置plsqldev时,报错误是找不到服务名 同 ... -
ORACLE-数据库导出(exp)/ 导入(imp)
2011-06-09 09:42 1458exp 将数据库内的各对象以二进制方式下载成dmp 文件, ...
相关推荐
检查数据发生死锁、阻塞的原因,并根据不同原因解决问题。
并发访问ORACLE数据库的数据死锁分析和解决措施.pdf
分析SQL Server 数据库中的死锁
本幻灯片主要介绍了分布式数据库相关死锁检测算法的分析研究
数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁
检查 Sql Server的阻塞和死锁--------------------------------------------
数据库死锁,阻塞查询,杀死死锁,阻塞进程
数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁
数据库死锁监控,自动刷新,右键杀死进程,查看存储历史执行时间等信息。
分布式课堂上分享讲的ppt,简要介绍了死锁检测的基本概念,以及分布式数据库几种常见的死锁检测算法。
解决死锁问题的三种方法:预防死锁,检测死锁及避免死锁。
SQLServer数据库死锁介绍,以及使用独立的事务模拟死锁的产生。
分布式数据库系统中死锁避免策略的选择,吴德州 ,武君胜, 提出了分析死锁工作的等待图的一种优化――带时戳的资源分配图,同时对分布式数据库系统中的死锁避免的两种方案通过例证给出了��
SQL Server数据库封锁及死锁研究.pdf
ORACLE数据库应用中死锁的分析及改进.pdf
oracle数据库解决死锁,使用plsql语句手动解决死锁问题
数据库 死锁的解决 其实所有的死锁最深层的原因就是一个:资源竞争 表现一: 一个用户A 访问表A(锁住了表A),然后又访问表B 另一个用户B 访问表B(锁住了表B),然后企图访问表A 这时用户A由于用户B已经锁住表B,它...
服务器运行一天后,就开始频繁报错:Deadlock found when trying to get to lock; try restarting transaction. 死锁的头号原因是外键未加索引,第二号原因是位图索引遭到并发更改;
较实用的ORACLE数据库死锁查杀,实用性较强。
判断数据库死锁的SQL,可以检测出死锁的语句和进程