理解乐观锁和悲观锁

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

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

使用场景:乐观锁使用于多读少写的应用类型,这样可以提高吞吐量;相反的情况则使用悲观锁

乐观锁和悲观锁是并发控制中两种常见的锁机制,它们分别基于不同的假设来处理数据的并发访问。

乐观锁
实现
  1. 版本号机制:在数据表中增加一个版本号字段,每次更新数据时,版本号加1。更新前检查版本号是否发生变化,如果发生变化则更新失败。
UPDATE table SET value = ?, version = version + 1 WHERE id = ? AND version = ?
  1. 时间戳机制:在数据表中增加一个时间戳字段,每次更新数据时,时间戳更新为当前时间。更新前检查时间戳是否发生变化,如果发生变化则更新失败。
UPDATE table SET value = ?, timestamp = CURRENT_TIMESTAMP WHERE id = ? AND timestamp = ?
场景
  • 多读少写:适用于读多写少的场景,因为乐观锁在读取数据时不加锁,可以提高读取的吞吐量。
  • 低并发:适用于并发冲突较少的场景,因为乐观锁在更新数据时需要检查数据是否被修改,如果冲突频繁,可能会导致大量重试。
悲观锁
实现
  1. 数据库锁:使用数据库的锁机制,如​​SELECT ... FOR UPDATE​​。
SELECT * FROM table WHERE id = ? FOR UPDATE
  1. 编程语言级别的锁:使用编程语言提供的锁机制,如Java中的​​synchronized​​关键字或​​ReentrantLock​​。
synchronized (lockObject) {
  
}
场景
  • 多写少读:适用于写多读少的场景,因为悲观锁在读取数据时就加锁,可以确保数据的一致性。
  • 高并发:适用于并发冲突较多的场景,因为悲观锁在读取数据时就加锁,可以避免频繁的更新冲突。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值