死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。当多个事务试图以不同的顺序锁定资源时,就可能产生死锁。多个事务同时锁定同一资源时,也会产生死锁。 例如,设想下面两个事务同时处理StockPrice 表:
事务1
start Transaction;
update StockPrice SET close =45.50 where stock_id = 4 and date =‘2002-05-01’;
update StockPrice SET close =19.80 where stock_id = 3 and date =‘2002-05-02;
事务2
start Transaction;
update StockPrice SET high =20.12 where stock_id = 3 and date =‘2002-05-02;
update StockPrice SET high=47.20 where stock_id = 4 and date =‘2002-05-01’;
如果凑巧,两个事务都执行了第一条UPDATE 语句, 更新了一行数据,同时也锁定了该行数据,接着每个事务都会尝试去执行第二条update数据,却发现该行已经被对方锁定,然后两个事务都等待对方释放锁,同时又持有对方需要的锁,则陷入死循环除非有外部因素介入才可能解除死锁。
为了解决这种问题,数据库系统实现了各种死锁检测和死锁超时机制,越复杂的系统,比如InnoDB 存储引擎,越能检测到死锁的循环依赖,并立即返回一个错误。这种解决方式很有效,否则死锁会导致出现非常慢的查询。 还有一种解决方式,就是当查询的时间达到锁等待超时的设定后放弃锁请求,这种方式通常来说不太好。Inno DB目前处理死锁的方法是,将持有最少行级排他锁的事务进行回滚,(这是相对比较简单的死锁回滚算法)
本文深入探讨了死锁现象,详细解释了死锁的定义及其在事务处理中的表现,通过具体案例展示了死锁如何形成,并阐述了数据库系统采用的死锁检测和解决策略。重点介绍了InnoDB存储引擎在处理死锁时采用的简单死锁回滚算法,以及死锁带来的性能影响。
1655

被折叠的 条评论
为什么被折叠?



