乐观锁 or 悲观锁 你怎么选?

你有没有听过这样一句话:悲观者正确,乐观者成功​。那么今天我来分享下什么是乐观锁​和悲观锁。

2c1afc4fa657c97734003819c0785be2

乐观锁和悲观锁有什么区别,它们什么场景会用

乐观锁

乐观锁基于这样的假设:多个事务在同一时间对同一数据对象进行操作的可能性很小,因此它允许多个事务同时进行,仅在事务提交时检查是否有其他事务对数据进行了修改。

特点

  • 无锁:乐观锁通常不使用数据库的锁定机制,而是通过其他方式(如时间戳、版本号)来确保数据一致性。
  • 性能:在冲突较少的情况下,乐观锁可以提供更好的性能,因为它允许高并发。
  • 冲突检测:在事务提交时检测冲突,如果检测到冲突,事务将被回滚。

实现方式

  • 版本号:在数据表中添加一个版本号字段或时间戳字段。事务开始时记录版本号,提交时检查版本号是否发生变化,如果变化了,则表示有冲突。
  • 时间戳:使用时间戳来控制事务的顺序,如果检测到时间戳冲突,则回滚事务。

适用场景

  • 写冲突较少:适用于写操作不频繁或者写冲突可能性较低的场景。
  • 读多写少:适用于读操作远多于写操作的环境。
  • 高并发:需要支持高并发访问的系统。

悲观锁

悲观锁基于这样的假设:多个事务对同一数据对象的并发操作会产生冲突,因此它在事务开始时就对数据对象加锁,直到事务结束才释放锁。

特点

  • 锁定:悲观锁通过数据库的锁定机制来确保数据一致性,如行锁或表锁。
  • 性能:在高冲突环境下,悲观锁可能导致更多的等待和锁竞争,从而影响性能。
  • 预防冲突:通过锁定机制预防冲突,而不是检测冲突。

实现方式

  • 显式锁定:使用数据库的锁定命令(如SELECT ... FOR UPDATE)来显式地锁定需要的资源。
  • 隐式锁定:通过数据库事务的隔离级别隐式地实现锁定。

适用场景

  • 写冲突较多:适用于写操作频繁或者写冲突可能性较高的场景。
  • 写多读少:适用于写操作多于读操作的环境。
  • 数据一致性要求高:需要严格保证数据一致性的场合。

相关推荐

  1. 乐观悲观

    2024-06-06 00:10:02       19 阅读
  2. 乐观悲观

    2024-06-06 00:10:02       10 阅读
  3. 乐观悲观

    2024-06-06 00:10:02       6 阅读
  4. python乐观悲观

    2024-06-06 00:10:02       35 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-06 00:10:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-06 00:10:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-06 00:10:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-06 00:10:02       18 阅读

热门阅读

  1. 事务与并发控制

    2024-06-06 00:10:02       8 阅读
  2. 恶意代码详解

    2024-06-06 00:10:02       9 阅读
  3. python 比较 mysql 表结构差异

    2024-06-06 00:10:02       8 阅读
  4. 探秘AI艺术:揭开Midjourney绘画的神秘面纱

    2024-06-06 00:10:02       9 阅读
  5. Tomcat启动闪退问题解决方法

    2024-06-06 00:10:02       9 阅读
  6. Oracle 表数据段收缩示例

    2024-06-06 00:10:02       8 阅读
  7. CMakeLists.txt和Package.xml

    2024-06-06 00:10:02       8 阅读
  8. C++--DAY3

    C++--DAY3

    2024-06-06 00:10:02      8 阅读