美文网首页
18 乐观锁与悲观锁的区别

18 乐观锁与悲观锁的区别

作者: 滔滔逐浪 | 来源:发表于2022-11-07 15:12 被阅读0次

乐观锁和悲观锁都是用于解决并发场景下的数据竞争问题,但是却是2种不同的思想。他们的使用非常的广泛,也不局限于某种语言或者数据库。

乐观锁的概念: 乐观锁指的是在操作数据的时候非常的乐观,乐观的认为被人不会同时修改数据,因此乐观锁默认不会上锁的,只有在执行更新的时候才会去判断在此期间别人是否修改了数据,如果别人修改了数据则放弃操作,否则执行操作。,
冲突比较少的时候,使用乐观锁,由于乐观锁的不上锁特性,所有在性能方面要比悲观锁好,比较适合在db的读大于写的业务场景。
悲观锁的概念:悲观锁指的是在操作数据库的时候比较悲观,悲观的认为别人一定会同时修改数据,因此悲观锁在操作数据库的时候是直接把数据上锁的,直到操作完成后才会释放锁,在上锁期间其他人不能操作数据。
冲突比较多的时候,使用悲观锁对于每一次数据修改都要上锁,如果在db读取需要比较大的情况下有线程在执行数据修改操作会导致读操作全部被挂载起来,等修改线程释放了锁才能读取到数据,体验感差。所以 比较适合用在db写大于读的时候

读取频繁使用乐观锁,写入频繁使用悲观锁。
乐观锁的实现方式:
乐观锁的实现方式主要有2种,一种是cas(Compare and Swap,比较并交换)机制,一种是版本号机制。
CAS机制:
CAS操作包括了三个操作数,分别是需要读取的内存位置(V)、进行比较的预期值(A)和拟写入的新值(B),操作逻辑是,如果内存位置V的值等于预期值A,则将该位置更新为新值B,否则不进行操作。另外,许多CAS操作都是自旋的,意思就是,如果操作不成功,就会一直重试,直到操作成功为止。
版本号机制:
版本号机制的基本思路,是在数据中增加一个version字段用来表示该数据的版本号,每当数据被修改版本号就会加1。当某个线程查询数据的时候,会将该数据的版本号一起读取出来,之后在该线程需要更新该数据的时候,就将之前读取的版本号与当前版本号进行比较,如果一致,则执行操作,如果不一致,则放弃操作
悲观锁的实现方式:
悲观锁的实现方式也就是加锁,加锁既可以在代码层面(比如java中的关键字synchronized关键字),也可以在数据库层面(比如MySQL中的排它锁)。
乐观锁和悲观锁并没有优劣之分,他们有各自的适合场景。

相关文章

  • 蚂蚁面试

    1、mysql乐观锁和悲观锁的区别? 乐观锁通过MVCC,版本实现,悲观锁select... for update...

  • Mysql锁

    按照使用方式,锁分为: 悲观锁 乐观锁 乐观锁 概念就不细讲了,乐观锁和悲观锁的区别是乐观锁是假设在修改数据之前,...

  • 史上最全 Java 中各种锁的介绍

    锁的分类介绍 乐观锁与悲观锁 锁的一种宏观分类是乐观锁与悲观锁。乐观锁与悲观锁并不是特定的指哪个锁(Java 中也...

  • 史上最全 Java 中各种锁的介绍

    锁的分类介绍 乐观锁与悲观锁 锁的一种宏观分类是乐观锁与悲观锁。乐观锁与悲观锁并不是特定的指哪个锁(Java 中也...

  • Java常用锁的分类及实现原理

    乐观锁与悲观锁 乐观与悲观的区别跟读写无关,区别在于对数据操作时加锁操作的差异,数据操作包括(读,写,删等); -...

  • 18 乐观锁与悲观锁的区别

    乐观锁和悲观锁都是用于解决并发场景下的数据竞争问题,但是却是2种不同的思想。他们的使用非常的广泛,也不局限于某种语...

  • 并发参数

    悲观锁与乐观锁 悲观锁 synchronized和ReentrantLock等独占锁就是悲观锁思想的实现乐观锁一般...

  • 面试官:靓仔,你真的会synchronized吗?

    悲观锁 & 乐观锁 在介绍synchronized之前,需要知道悲观锁&乐观锁。悲观锁与乐观锁是一种广义上的概念,...

  • 乐观锁和悲观锁

    参考来源 深入理解乐观锁与悲观锁 乐观锁的一种实现方式——CAS mysql乐观锁总结和实践 乐观锁和悲观锁 悲观...

  • Spring Elasticsearch data 乐观锁并发控

    Spring ElasticSearch data 乐观锁并发控制 乐观锁与悲观锁 悲观锁(Pessimistic...

网友评论

      本文标题:18 乐观锁与悲观锁的区别

      本文链接:https://www.haomeiwen.com/subject/nvpbtdtx.html