`

数据库阻塞和死锁的区别(转载)

 
阅读更多
数据库阻塞和死锁的区别(转载)
数据库阻塞和死锁在程序开发过程经常出现,怎么样避免呢?下面通过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
分享到:
评论

相关推荐

    数据库阻塞/死锁检查处理方法

    数据库阻塞/死锁检查处理方法 数据库阻塞/死锁检查处理方法是一种用于解决数据库阻塞/死锁问题的方法。该方法通过检查数据库中的等待事件、锁等待情况、会话情况等来判断数据库是否存在阻塞/死锁,并根据不同的原因...

    并发访问ORACLE数据库的数据死锁分析和解决措施.pdf

    并发访问ORACLE数据库的数据死锁分析和解决措施 Oracle数据库是一个关系型数据库管理系统,广泛应用于各种行业领域。在实际应用中,高并发访问数据库可能会导致数据死锁问题,本文将对数据死锁分析和解决措施进行...

    查看阻塞和死锁

    在数据库管理领域,阻塞和死锁是两个常见的问题,它们可以严重影响数据库系统的性能和稳定性。本文将基于提供的存储过程“sp_who_lock”来深入探讨如何检测和处理阻塞和死锁的情况。 ### 阻塞(Blocking) 阻塞是...

    sql数据库死锁查询工具

    在SQL数据库管理中,死锁和阻塞是常见的问题,特别是在多用户环境下,它们可能导致系统性能下降甚至数据丢失。理解并有效地处理这些问题至关重要。本文将深入探讨“sql数据库死锁查询工具”及其在解决数据库死锁和...

    oracle数据库解决死锁

    Oracle数据库解决死锁 Oracle数据库解决死锁是指在Oracle数据库中出现的死锁问题,通过使用PL/SQL语句手动解决死锁问题。...同时,也需要了解Oracle数据库的工作原理和死锁机理,以便更好地解决死锁问题。

    分析SQL Server 数据库中的死锁

    这个存储过程通过分析`sysprocesses`表中的数据,返回包含死锁事务的SPID(会话进程ID)和被阻塞的SPID,以及它们正在执行的SQL语句,便于快速定位问题。 #### 存储过程的使用 一旦创建了`sp_who_lock`存储过程,...

    查看数据库死锁信息

    本篇文章将详细讲解如何查看和分析MySQL数据库中的死锁信息。 标题所提及的"查看数据库死锁信息"是一个至关重要的任务,因为死锁可能导致数据库性能下降,甚至影响到服务的正常运行。当出现"Deadlock found when ...

    数据库死锁-解决死锁问题的三种办法

    总之,解决数据库死锁问题的三种方法各有优缺点,实际应用中应根据具体情况和需求选择最适合的策略。预防死锁虽能有效避免死锁的发生,但可能限制了资源的利用率;检测死锁虽然灵活性较高,但可能会增加系统的复杂性...

    分布式数据库中常见死锁检测算法分析

    本幻灯片主要介绍了分布式数据库相关死锁检测算法的分析研究

    Oracle数据库死锁查询语句

    了解如何查询和解决Oracle数据库中的死锁对于数据库管理员来说至关重要。 首先,我们要明白死锁的四个必要条件: 1. **互斥**:资源不能同时被多个事务占用。 2. **请求与保持**:事务已经占有至少一个资源,但又...

    检查 Sql Server的阻塞和死锁

    检查 Sql Server的阻塞和死锁--------------------------------------------

    数据库死锁监控.exe

    数据库死锁监控,自动刷新,右键杀死进程,查看存储历史执行时间等信息。

    mysql死锁的一些案例

    死锁是数据库系统中常见的问题,尤其在多用户、高并发的应用场景下,了解和处理死锁显得尤为重要。 这篇博客文章《mysql死锁的一些案例》可能深入探讨了MySQL中死锁的产生原因、表现形式以及解决策略。虽然具体内容...

    ORACLE数据库应用中死锁的分析及改进.pdf

    《ORACLE数据库应用中死锁的分析及改进》 在ORACLE数据库系统中,死锁是一种常见的并发控制问题,尤其在多用户、多任务环境中,可能导致数据库操作停滞不前,严重影响系统的正常运行。死锁发生时,两个或多个事务...

    DB2数据库处理表死锁

    死锁会严重阻碍数据库的正常运行,因此了解如何识别和解决DB2中的死锁问题至关重要。 #### 二、死锁检测与分析工具 **1. 获取锁快照命令:** - **命令格式:** `db2=>get snapshot for locks on <database_name>` ...

    分布式数据库死锁检测算法分析

    分布式课堂上分享讲的ppt,简要介绍了死锁检测的基本概念,以及分布式数据库几种常见的死锁检测算法。

    SQL Server数据库封锁及死锁研究.pdf

    SQL Server数据库封锁与死锁是数据库管理系统中重要的并发控制机制,用于保证数据的一致性和完整性。封锁是防止多个并发事务对同一数据进行不协调访问的一种手段,而死锁则是多个事务相互等待对方释放资源而形成的一...

    数据库 死锁的解决

    为了更好地理解和解决数据库死锁问题,下面将详细介绍几种优化策略及实际应用场景。 1. **统一锁定顺序:** 保证在所有事务中按相同顺序锁定资源是预防死锁的有效手段之一。例如,在编写存储过程时,可以明确指定...

    数据库死锁原理实验

    SQLServer数据库死锁介绍,以及使用独立的事务模拟死锁的产生。

    数据库死锁分析.doc

    数据库死锁分析是数据库设计、开发和运行维护中非常重要的一个问题,需要严格遵守《数据库设计规范》,使用行锁和控制事务的执行时间,避免死锁的产生,并定期检查数据库日志,自动解开死锁,避免死锁对数据库的影响...

Global site tag (gtag.js) - Google Analytics