理解乐观锁和悲观锁
创作时间:
作者:
@小白创作中心
理解乐观锁和悲观锁
引用
1
来源
1.
https://www.cnblogs.com/2324hh/p/18536657
在多线程或分布式系统中,数据的并发访问控制是一个重要的问题。乐观锁和悲观锁是两种常见的解决方案,它们分别基于不同的假设来处理数据的并发访问。本文将详细介绍这两种锁机制的概念、实现方式和适用场景。
乐观锁
乐观锁的基本假设是:每次去拿数据的时候别人不会修改,所以不会上锁,但是每次要拿数据的时候都会先判断数据是否被别人修改。
实现方式
版本号机制:在数据表中增加一个版本号字段,每次更新数据时,版本号加1。更新前检查版本号是否发生变化,如果发生变化则更新失败。
UPDATE table SET value = ?, version = version + 1 WHERE id = ? AND version = ?时间戳机制:在数据表中增加一个时间戳字段,每次更新数据时,时间戳更新为当前时间。更新前检查时间戳是否发生变化,如果发生变化则更新失败。
UPDATE table SET value = ?, timestamp = CURRENT_TIMESTAMP WHERE id = ? AND timestamp = ?
使用场景
- 多读少写:适用于读多写少的场景,因为乐观锁在读取数据时不加锁,可以提高读取的吞吐量。
- 低并发:适用于并发冲突较少的场景,因为乐观锁在更新数据时需要检查数据是否被修改,如果冲突频繁,可能会导致大量重试。
悲观锁
悲观锁的基本假设是:认为每次去拿数据的时候别人都会修改,所以每次都会上锁。
实现方式
数据库锁:使用数据库的锁机制,如
SELECT ... FOR UPDATE。SELECT * FROM table WHERE id = ? FOR UPDATE编程语言级别的锁:使用编程语言提供的锁机制,如Java中的
synchronized关键字或ReentrantLock。synchronized (lockObject) { // ... }
使用场景
- 多写少读:适用于写多读少的场景,因为悲观锁在读取数据时就加锁,可以确保数据的一致性。
- 高并发:适用于并发冲突较多的场景,因为悲观锁在读取数据时就加锁,可以避免频繁的更新冲突。
热门推荐
考公考编深度解析:概念差异与备考指南(面向2024年)
地球质量达60万亿亿吨,为什么能悬浮在太空而没有掉落?
四种类型颈椎病,哪一种最不好惹 | 科普时间
当心膝盖健康掉进恶性循环,这件事情千万别选错
LOL:暴击流大嘴火力全开 Uzi三大上分ADC推荐
杭州集中销毁超7500件假冒伪劣商品
电商平台买到假货怎么办?详细维权指南
当甲骨文遇见当代知音
诗经六义分别是什么
《哪吒》票房分成揭秘:导演饺子的收入和背后故事
六氟磷酸锂价格还在探底,天赐材料上半年净利预降约八成
大地上的异乡者,先锋书店的十年乡村路
你知道国际消费者权益日的历史吗?
减肥期晚餐可以吃红薯吗?会胖吗?
铁皮石斛花到底能不能吃?(解析铁皮石斛花的药用价值与食用安全性)
兼香型白酒的香味成分特点及风味特征
葡萄酒品鉴:专业指南与技巧分享
青柠檬vs黄柠檬:别再用错,它们的区别你一定要知道!
植物大战僵尸界面设计,用户体验与视觉美学的融合
9 个小方法,助你降低胆固醇
过年家宴必备:外酥里嫩的炸虾仁制作全攻略
心源性休克来势汹汹,死亡率高达50%以上,一旦发生,记住4点
8种润肺生津降火气的冬瓜汤做法,冬瓜煮什么汤清热去火?
N卡控制面板设置优化指南:提升游戏性能与画质
校园文化建设:六类活动提升学生参与度
独立开发3DRPG单机手游:从理念到推广的全方位指南
70岁仍在职场!香港、日本、新加坡退休比较
老车气门室盖漏油怎么办?原厂塑料盖和铝合金盖哪个更好?
球幕投影屏核心加工工艺全解析:从材料到曲面校准
指南针标记“N”指向的是什么方向?