面试官:说说MySQL 中的悲观锁和乐观锁

锁机制的基本概念

  • 锁的作用:确保某一时刻只有一个线程执行操作,其他线程需等待。
  • 锁的适用性:主要针对写入操作,不适用于读取操作。

应用锁与数据库锁

  • 应用锁:通过编程语言特性实现,如 Java 的 Synchronized 和 Go 的 Mutex
  • 数据库锁:数据库层面提供,简化分布式架构。

悲观锁

  • 定义:显式锁,依赖 MySQL 的 InnoDB 存储引擎和事务机制。
  • 实现:通常与 select for update 语句相关,核心是 update 语句。
  • 示例
    begin;
    -- A操作
    select name from user where id = 1 for update;
    -- B操作
    commit;
    
  • 锁的持有和释放:通过事务的开始和提交控制。
  • 锁的范围:默认作用于具有唯一索引的数据行,无索引可能升级为表级锁。

乐观锁

  • 定义:基于数据并发冲突罕见的假设,不依赖数据库显式锁定。
  • 实现:通常通过版本号 version 来跟踪数据变更。
  • 示例
    select from user where id = 1;
    update user set name = #{name}, 
    version = version + 1 where id = 1 and version = 0;
    
  • 冲突处理:在提交更新前检查版本号,不一致则拒绝更新。

锁的优缺点

  • 悲观锁
    • 优点:有效处理并发事务中的冲突问题。
    • 缺点:可能影响并发性能。
  • 乐观锁
    • 优点:允许高并发执行,减少锁争用,提高吞吐量。
    • 缺点:需要应用层面处理冲突。

总结

  • MySQL 原生支持悲观锁,乐观锁通过应用逻辑实现。
  • 锁机制可以简化分布式架构,提高应用与数据库的协同效率。
  • 锁机制的选择应基于业务需求和性能考量。

其他考虑

  • 在高并发场景下,可能需要使用性能更优的解决方案,如 Redis。
  • 在常规业务场景中,MySQL 的锁机制通常足够应对需求。

相关推荐

  1. 面试说说MySQL 悲观乐观

    2024-07-15 17:48:04       20 阅读
  2. 【SQL】MySQL 乐观悲观

    2024-07-15 17:48:04       20 阅读
  3. 乐观悲观

    2024-07-15 17:48:04       33 阅读
  4. 乐观悲观

    2024-07-15 17:48:04       31 阅读
  5. Go语言乐观悲观

    2024-07-15 17:48:04       64 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 17:48:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 17:48:04       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 17:48:04       58 阅读
  4. Python语言-面向对象

    2024-07-15 17:48:04       69 阅读

热门阅读

  1. Redis① —— Redis基础

    2024-07-15 17:48:04       20 阅读
  2. LeetCode 445.两数相加||

    2024-07-15 17:48:04       16 阅读
  3. openstack

    2024-07-15 17:48:04       19 阅读
  4. Memcached与Redis:缓存解决方案的较量与选择

    2024-07-15 17:48:04       21 阅读
  5. pandas读取超过16位的excle

    2024-07-15 17:48:04       16 阅读
  6. blinker库

    2024-07-15 17:48:04       19 阅读