zoukankan      html  css  js  c++  java
  • Mysql是否发生死锁,死锁场景【转】

    之前在面试中被问到此问题,在此做下笔记!
    Mysql场景的存储引擎为MyISAM和InnoDB,我们以这两种来分析。

    MyISAM

    总:MyISAM中不会出现死锁。
    在MyISAM中只用到表锁,不会有死锁的问题,锁的开销也很小,但是相应的并发能力很差。
    解析:MyISAM不支持事务,即每次的读写都会隐性的加上读写锁,而我们知道读锁是共享的,写锁是独占的,意味着当一个Session在写时,另一个Session必须等待。

    InnoDB

    *总:InnoDB中会出现死锁。
    InnoDB中实用了行锁和表锁,当未命中索引时,会自动退化为表锁。
    我们举一个出现死锁的例子。
    假设我们有个账户金额表 user_balance,包括两个字段,分别是 username 用户名、balance 余额。(例子来源极客时间“sql必知必会”)
    某时刻用户 A 和用户 B 之间进行转账,同时数据库管理员想要查询 user_balance 表中的总金额:

    SELECT SUM(balance) FROM user_balance
    1
    当我们读取的时候用了加行锁,可能会出现死锁的情况,若 B 开始执行给 A 转账:

    UPDATE user_balance SET balance=balance-100 WHERE username ='B'
    1
    UPDATE user_balance SET balance=balance+100 WHERE username =‘A’

    UPDATE user_balance SET balance=balance+100 WHERE username ='A'
    1
    我们会发现此时 A 被锁住了,而管理员事务还需要对 B 进行访问,但 B 被用户事务锁住了,此时就发生了死锁。


    解决方法为InnoDB中的MVCC机制,之后的博客再做介绍,或者读者可以自行了解下这种机制。
    ————————————————
    版权声明:本文为CSDN博主「Hpsyche」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/Hpsyche/article/details/102076870

  • 相关阅读:
    keepalived 打印日志
    mysql 主从切换
    mysql 开启只读 普通用户无法写入
    主从复制同步mysql数据库后会导致从上用户无法登陆
    MySQL性能优化的最佳20+条经验(1)
    MySQL性能测试工具之mysqlslap
    关于ad所用端口
    mysql 从设置只读
    ARP表信息引起的telnet 时断时通
    Caused by: java.sql.SQLException: ResultSet is from UPDATE. No Data.
  • 原文地址:https://www.cnblogs.com/ben-zhou/p/13164490.html
Copyright © 2011-2022 走看看