`

详细分析不同类型数据库的死锁问题

    博客分类:
  • java
阅读更多

关键字: 详细 类型 数据库 死锁
论坛中有很多关于死锁问题的讨论,在理论方面,R.Ramakrishnan的《Database management systems》也有非常精辟的阐述。就实际开发而言,不同的数据库环境有着不同的处理方法,不同的体系架构也会导致不同的结果,下面来简单介绍一下不同类型数据库的死锁问题。

  1.MSSQL、DB2、Oracle之类的现代DBMS或者中间件可以帮助我们自动解决绝大部分死锁,其余一部分难以处理的死锁则由DBA在数据库控制端手工处理。就应用程序而言,不需要在源代码级过多考虑地考虑死锁问题。

  2.死锁的发生对系统的性能和吞吐量有着明显的影响,但只要存在针对共享数据资源的大规模并发访问的情况,那么死锁是不可避免的。

  理论上,预防死锁的最好的途径是:给每一个transaction设定一个优先级,同时确保较低优先级的事务不必等待较高优先级事务释放共享资源,反过来,也确保较高优先级的事务能够立刻取得相应的资源。如果开发人员无法判别事务的优先级,那么可以考虑在每个事务开始时赋予它一个的时间戳,依据时间戳的先后来判定事务的优先级,这类似于FIFO队列。在这方面,现代DBMS都提供了相应的语言支持。但是,假设由于网络故障而导致高优先级的事务无法commit或者rollback,那么是否其他低级别事务便要一直等待或者被抛弃?或者一个事务中的update操作施加了多个表级锁,并且占用了大量时间,那么即便这种事务从逻辑上并不合理,是否也要保持它的高优先级?

  针对稀缺资源的竞争在任何场合都是正常的,死锁出现的因果关系给予我一个提示,就是不能盲目地依赖DBMS和DBA在死锁发生后再去解决死锁问题,那样必然已经对用户体验造成了消极影响。开发人员在设计过程中,需要更多地研判可能的并发访问问题。这些问题可能包括:

  1. 尽可能缩短事务。在同一DB中并发执行多个需要长时间运行的事务时,发生死锁的概率较大。事务运行时间越长,其持有exclusive锁或update锁的时间便越长,从而堵塞了其它活动并可能导致死锁。保持事务在一个批处理中,可以最小化事务的网络通信往返量,减少完成事务可能的延迟并释放锁。同时,涉及多个表的查询更新操作,若比较耗时,尽量不要放在一个事务内处理,能分割便分割。若不能分割,便尽可能使之在业务量较小的时间(例如子夜或者午餐时间)执行。

  2. 尽可能按同一顺序访问数据对象。如果所有并发事务按同一顺序访问对象,则发生死锁的可能性会降低。

  3. 避免编写包含用户交互的事务。因为运行没有用户交互的批处理的速度要远远快于用户手动响应查询的速度,若用户不能及时反馈,则此事务将挂起。因而将严重降低系统的吞吐量,因为事务持有的任何锁只有在事务提交或回滚时才会释放。即使不出现死锁的情况,访问同一资源的其它事务也会被阻塞,等待该事务完成。

  4. 使用低隔离级别。确定事务是否能在更低的隔离级别上运行。执行提交读允许事务读取另一个事务已读取(未修改)的数据,而不必等待第一个事务完成。使用较低的隔离级别(例如提交读)而不使用较高的隔离级别(例如可串行读)可以缩短持有共享锁的时间,从而降低了锁定争夺。

  5. 考虑体系结构的优化与代码重构,提高系统整体的运行效率。例如尽可能不要采用类似EJB的效率低下的计算模型,或者将复杂的业务置于编译存储过程中执行。

  6. 通过程序控制事务提交的时机。如果一次检索出了10万条记录但只更改了其中的100条,就可以通过代码来执行100个update。或是用分段提交,即所有的修改使用多个事务进行提交,但这样会使事务不完整,应酌情使用。

  7. 将经常更新的数据库和查询数据库分开。定期将不改变的数据导入查询数据库中,这样查询和更新就可以分开进行,而降低死锁机率。

  8. 在进行数据库模式设计时,注意外键引用的完整性,并对外键加索引。如果更新了父表的主键,由于外键上没有索引,所以子表会被锁定;如果删除了父表中的一行,整个子表也会被锁定。

分享到:
评论

相关推荐

    数据库死锁分析.doc

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

    数据库 死锁的解决

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

    解决Sybase数据库死锁

    ### 解决Sybase数据库死锁 #### Sybase数据库死锁概述 死锁是数据库管理系统中一个常见的问题,尤其是在高并发的环境下更为突出。Sybase数据库中的死锁通常发生在两个或多个事务试图锁定相同的资源(如表或记录)时...

    查看数据库死锁SQL

    ### 查看数据库死锁SQL 在数据库管理与优化过程中,处理死锁问题是非常重要的一个环节。死锁是指两个或更多的事务在等待对方释放资源时所形成的一种僵局状态,这会导致事务无法继续执行,严重影响数据库系统的性能...

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

    SQL Server数据库封锁与死锁是数据库管理系统中重要的并发控制机制,用于保证...通过合理设计事务、优化SQL语句以及利用SQL Server提供的并发控制工具,可以有效地预防和解决数据库死锁问题,提高系统的可用性和性能。

    ORA-00060: 等待资源时检测到死锁--oracle 数据库表死锁异常

    在描述中提到的博文链接中,可能包含了通过这些视图分析死锁问题的实例。"表死锁反馈.doc"文件很可能是详细的死锁事件报告,包括了死锁链路、等待事件、锁定资源等关键信息。 解决死锁通常涉及以下几个策略: 1. ...

    大牛出手MySQL死锁深入分析

    通过以上分析,我们可以得出结论:死锁问题是多用户数据库系统中不可避免的问题,深入理解死锁的成因和预防措施对于优化数据库性能和提高系统稳定性至关重要。开发者和数据库管理员需要在实际工作中不断积累经验,...

    InnoDB数据库死锁问题处理

    【InnoDB数据库死锁问题处理】 InnoDB存储引擎在MySQL中是默认的事务型存储引擎,它支持行级锁定机制,这使得多个事务能够并行处理数据而不相互干扰。然而,这种灵活性也可能导致死锁(Deadlock)问题,即两个或多...

    DB2数据库处理表死锁

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

    Sqlserver分析死锁进程

    在SQL Server数据库管理中,死锁是一个常见的问题,它发生在两个或多个事务相互等待对方释放资源,从而导致所有事务都无法继续执行的情况。SQL Server提供了多种工具和方法来检测和分析死锁,以便管理员能够及时发现...

    orcale死锁查杀PB版

    总之,"Oracle死锁查杀PB版"是DBA处理数据库死锁问题的得力助手。通过理解死锁的原理,结合此工具,可以有效地防止和解决死锁问题,确保数据库系统的稳定性和高效运行。在实际操作中,应结合具体的业务场景,持续...

    何登成 - 管中窥豹——MySQL(InnoDB)死锁分析之道

    在实际中,解决MySQL(InnoDB)的死锁问题需要深入了解死锁产生的原因、锁的类型以及加锁策略,进而对业务逻辑进行优化或调整数据库配置和代码逻辑以减少死锁的可能性。 ### 个人简介 何登成作为阿里巴巴DBA团队的...

    oracle死锁故障分析和诊断解决

    在Oracle数据库管理中,死锁是一个常见的问题,它发生在两个或多个事务互相等待对方释放资源时,导致所有事务都无法继续执行的情况。本文将深入探讨Oracle死锁的原因、诊断方法及解决方案。 #### 一、死锁的基本...

    DB2解决表死锁

    在数据库管理领域,死锁是常见的问题之一,尤其是在并发环境中。DB2,作为IBM的一款强大关系型数据库管理系统,也不例外。本文将深入探讨“DB2解决表死锁”这一主题,结合提供的资源“DB2解除表锁.doc”,我们将讨论...

    mysql innodb死锁问题详解.docx

    1. 确认环境:首先了解数据库版本(例如MySQL 5.6.34)和存储引擎(InnoDB),并分析错误日志,发现可能是死锁问题。 2. 检查隔离级别:查看数据库的事务隔离级别,包括Read Uncommitted、Read Committed、...

    db2死锁问题.doc

    这条命令的作用是开启DB2的监控开关,使得系统能够记录下有关锁定的信息,包括但不限于锁定的类型、持续时间等,这对于后续分析死锁原因非常重要。 ##### 2. 查看死锁状态 一旦开启了监控开关,就可以通过以下命令...

    SQLSERVER谈死锁的监控分析解决思路共8页.pdf

    以下是对“SQLSERVER谈死锁的监控分析解决思路共8页.pdf”这一主题的详细探讨。 1. **死锁定义与产生条件**: - **循环等待**:在死锁中,存在一个事务集合,每个事务都在等待另一个事务释放资源。 - **不可抢占...

Global site tag (gtag.js) - Google Analytics