数据库死锁分析

首先,来分析一下数据库死锁的原因:数据库有很多种存储引擎,前面的博文中也分析过。前面主要讲了MyISAM和InnoDB这两种引擎,每种引擎对于锁的机制是不同的。而前面也曾提及,MyISAM存储引擎是不会出现死锁情况的,在这里我们主要讨论的是InnoDB存储引擎出现死锁的原因。

那么为什么MyISAM中不会出现死锁呢?我自己思考了一下,可能有以下原因,讲述的可能不正确,大家借鉴思考吧!首先,MyISAM数据库不支持事务,每一条SQL语句都是独立的一个执行结果,获得锁释放锁。不会说第一条语句到第二条语句还没有释放。而mysql中的表级锁是自动添加的,而且,MyISAM每次会为sql语句的执行一次性获取所有的锁或者等待。不存在持有一个锁等待另一个锁的情况。所以,根本不会出现死锁的情况。

理解了MyISAM不会产生死锁的原因后,对于理解InnoDB为什么会死锁有很大的帮助。InnoDB中有事务,而每条sql语句获取的锁是在事务提交的时候才释放。所以,就会存在一种情况:事务一获取了表一中的锁,事务二获取了表二中的锁,事务一等待表二的锁,事务二等待表一的锁。这种情况下,就会造成死锁。

发生死锁后,InnoDB一般都能够自动检测到,并是一个事物释放锁并回退,另一个事务获得锁,继续完成事务。可以设置锁等待超时参数。

通常来说,死锁都是应用设计的问题。通过调整业务流程等能够一定程度上避免死锁。下面介绍几种书上介绍的方法:

(1)尽量使用相同的顺序访问表,可以大大降低死锁的机会。

(2)在事务中,如果要更新记录,应该一次性申请足够的锁,即排它锁。


以上是个人的理解,理解的很片面

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值