美文网首页高性能MySQL
MySQL中的锁5-死锁

MySQL中的锁5-死锁

作者: Coding小聪 | 来源:发表于2018-08-11 16:08 被阅读2次

什么是死锁

在程序执行过程中,有两个或两个以上的事务因为争夺锁资源而造成的一种相互等待的现象。例如:事务t1和事务t2在执行过程中都需要获取锁A和锁B,实际运行过程有可能会是t1获取到锁A等待获取锁B,与此同时,t2已经获取到锁B且等待获取锁A。这时事务t1和事务t2都想获取对方持有的锁,而它们已经获取的锁在事务未执行完又不能释放。所以此时死锁就产生了,这也是常见的AB-BA死锁。下面演示一下这个死锁:

会话1
会话2

MySQL中通过wait-for graph会自动检测出是否产生了死锁。
当检测到发生了死锁时,MySQL会自动回滚。而发送错误(非死锁),事务会中止不会自动回滚,需要手动回滚或提交。

解决死锁

我们可以通过锁超时来解决死锁问题,在InnoDB可以通过innodb_lock_timeout变量来设置锁的超时时间。

典型的死锁案例剖析

一、购物车死锁

环境说明
• 用户1 的购物车:
1. product_id= 100 的商品
2. product_id= 110 的商品
3. product_id= 10 的商品
• 用户2 的购物车:
1. product_id= 10 的商品
2. product_id= 110 的商品
3. product_id= 100 的商品
1. 当一个商品被购买时,其中有一个环节是 库存减1 ,即做update操作( set stock=stock-1 where product_id=xx)
2. 当两个用户购买的产品的 product_id 顺序交叉,且两个用户同时下订单时,购物车中的每个商品都会执行 库存减1 的操作,即 每个用户 在各自的 一个事物 中做 三次update 操作,此时即发生了 死锁 (类似AB-BA死锁)

解决办法
在应用程序端进行修改,即提交购物车订单时,对 订单进行排序 ,然后再执行提交。这样只会出现锁等待,而不会出现死锁

MySQL中存在很多非常复杂的产生死锁的情况,但是产生原因都是一样的,后续实际工作中遇到再进行补充吧。

相关文章

  • MySQL中的锁5-死锁

    什么是死锁 在程序执行过程中,有两个或两个以上的事务因为争夺锁资源而造成的一种相互等待的现象。例如:事务t1和事务...

  • 高性能Mysql笔记

    一、Mysql架构与历史 1、架构图 2、锁 表锁 行级锁 3、事务 死锁 Mysql中的事务 1

  • 数据库_锁

    六、数据库锁1.mysql都有什么锁,死锁判定原理和具体场景,死锁怎么解决?MySQL有三种锁的级别:页级、表级、...

  • 8)MySQL死锁及解决方案

    前面我们了解了MySQL的锁类型,那么在使用锁之后,大概率会出现死锁的情况。 什么是死锁 死锁是并发系统中常见的问...

  • 乐观锁幂等性

    如何避免MySQL死锁: 思路: 1、 因为加锁而导致死锁, 所以放弃使用悲观锁方案, 改为乐观锁方案 2、 如果...

  • MySQL的锁

    一. MySQL的锁粒度 按锁的粒度分,MySQL的锁可以分为三类: 行级锁:加锁开销最大,且有可能出现死锁,但并...

  • Mysql | 锁——死锁

    当并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,就会导致这几个线程都进入无限等待的状态...

  • Mysql - 死锁

    Mysql - 死锁 死锁,就是产生了循环等待链条,我等待你释放锁,你却等待我释放锁,我们都相互等待,谁也不释放自...

  • Mysql并发时经典常见的死锁原因及解决方法

    1. mysql都有什么锁 MySQL有三种锁的级别:页级、表级、行级。 表级锁:开销小,加锁快;不会出现死锁;锁...

  • mysql 中的锁结构

    Mysql 支持3中锁结构 表级锁,开销小,加锁快,不会出现死锁,锁定的粒度大,冲突概率高,并发度最低 行级锁,开...

网友评论

    本文标题:MySQL中的锁5-死锁

    本文链接:https://www.haomeiwen.com/subject/gtbbvftx.html