问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

理解乐观锁和悲观锁

创作时间:
作者:
@小白创作中心

理解乐观锁和悲观锁

引用
1
来源
1.
https://www.cnblogs.com/2324hh/p/18536657

在多线程或分布式系统中,数据的并发访问控制是一个重要的问题。乐观锁和悲观锁是两种常见的解决方案,它们分别基于不同的假设来处理数据的并发访问。本文将详细介绍这两种锁机制的概念、实现方式和适用场景。

乐观锁

乐观锁的基本假设是:每次去拿数据的时候别人不会修改,所以不会上锁,但是每次要拿数据的时候都会先判断数据是否被别人修改。

实现方式

  1. 版本号机制:在数据表中增加一个版本号字段,每次更新数据时,版本号加1。更新前检查版本号是否发生变化,如果发生变化则更新失败。

    UPDATE table SET value = ?, version = version + 1 WHERE id = ? AND version = ?
    
  2. 时间戳机制:在数据表中增加一个时间戳字段,每次更新数据时,时间戳更新为当前时间。更新前检查时间戳是否发生变化,如果发生变化则更新失败。

    UPDATE table SET value = ?, timestamp = CURRENT_TIMESTAMP WHERE id = ? AND timestamp = ?
    

使用场景

  • 多读少写:适用于读多写少的场景,因为乐观锁在读取数据时不加锁,可以提高读取的吞吐量。
  • 低并发:适用于并发冲突较少的场景,因为乐观锁在更新数据时需要检查数据是否被修改,如果冲突频繁,可能会导致大量重试。

悲观锁

悲观锁的基本假设是:认为每次去拿数据的时候别人都会修改,所以每次都会上锁。

实现方式

  1. 数据库锁:使用数据库的锁机制,如 SELECT ... FOR UPDATE

    SELECT * FROM table WHERE id = ? FOR UPDATE
    
  2. 编程语言级别的锁:使用编程语言提供的锁机制,如Java中的 synchronized 关键字或 ReentrantLock

    synchronized (lockObject) {
        // ...
    }
    

使用场景

  • 多写少读:适用于写多读少的场景,因为悲观锁在读取数据时就加锁,可以确保数据的一致性。
  • 高并发:适用于并发冲突较多的场景,因为悲观锁在读取数据时就加锁,可以避免频繁的更新冲突。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号