登录
首页 >  数据库 >  MySQL

乐观锁 悲观锁

来源:SegmentFault

时间:2023-02-23 19:27:50 421浏览 收藏

本篇文章给大家分享《乐观锁 悲观锁》,覆盖了数据库的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

乐观锁 & 悲观锁 是一种设计思想,而不是锁的实现

在Java和MySql中,都有基于乐观锁和悲观锁的实现。Java中的atomic包(CAS,基于乐观锁),synchronized(重量级锁,基于悲观锁);MySql中的lock in share mode和select for update;

乐观锁

认为对同一资源的并发操作不会总发生,属于小概率事件,不用每次都对数据上锁,也就是不采用数据库自身的锁机制,而是通过程序来实现,可以通过版本号机制或者时间戳机制实现。
例如在表中设计一个版本字段 version,第一次读的时候,会获取 version 字段的取值。然后对数据进行更新或删除操作时,会执行UPDATE ... SET version = version + 1 WHERE version = version。此时如果已经有事务对这条数据进行了更改,修改就不会成功。
乐观锁的时间戳机制
时间戳和版本号机制一样,也是在更新提交的时候,将当前数据的时间戳和更新之前取得的时间戳进行比较,如果两者一致则更新成功,否则就是版本冲突。

悲观锁

对数据被其他事务的修改持保守态度,会通过数据库自身的锁机制来实现,从而保证数据操作的排它性。

适用场景

乐观锁适合读操作多的场景,相对来说写的操作比较少。它的优点在于程序实现,不存在死锁问题,不过适用场景也会相对乐观,因为它阻止不了除了程序以外的数据库操作。
悲观锁适合写操作多的场景,因为写的操作具有排它性。采用悲观锁的方式,可以在数据库层面阻止其他事务对该数据的操作权限,防止读 - 写和写 - 写的冲突。

理论要掌握,实操不能落!以上关于《乐观锁 悲观锁》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>