`

悲观锁和乐观锁

阅读更多

悲观锁 :Pessimistic Lock

乐观锁:Optimistic Lock

       这篇文章我们主要讲的是悲观锁和乐观锁的基本概念及使用场景,首先我们用一个小例子来让大家知道什么是悲观锁和乐观锁:

       小陶大学期间开始创业,是一个电商网站的创始人,小永和小攀是他电商网站中的两个线程,马上就要双十一了,为了营造一种紧张的感觉,小陶决定把某雪地靴的库存减少50,并通知小永修改,小永不敢怠慢赶紧看了一下库存,是500;与此同时,小攀接到通知把库存量减少100,小攀也赶紧看了库存,是 500;于是他们分别执行,小永把450存了进去,小攀把400存了进去,并同时把小永的数据覆盖;小陶看了一下现在的库存,发现数量不对,于是盘问了小永和小攀,想出了一个办法来解决这种冲突问题,每次读写都进行加锁操作,就是在小永操作的时候,加上一个锁,当小永操作结束的时候,小攀才能进行读写 操作;于是小陶修改了一下自己的程序,又向小永和小攀发送了同样的命令,小永进去后,加了一个锁,小攀进入block车间,等了好久发现小永还没有操作完成,直到其操作完成,小攀 才开始进行加锁操作(这就是悲观锁,每次去拿数据都认为 别人会修改,于是对每次拿到数据的时候都会加上锁,其他 线程想要拿到这个 数据就会block,直到上一个操作完成并释放锁,传统的数据库中有很多这种锁机制,比如行锁、表锁、读锁、写锁等,都是在操作之前先上锁的);一次小陶优化自家网站速度的时候发现了这个耗时的操作,苦思冥想之后决定采用第二种方案,就是小永进行操作的时候每次加上一个版本号,例如 初始化的 时候版本号为1,当小永访问并操作完成的时候,把自己最开始读取到的版本号加1,这时小攀读取到的版本号也是1,当操作完成的时候在读取数据,当版本号与自己操作前读取的一致的时候,就把版本号加 1,并储存起来,当不一致 的时候,就重新 读取操作,直至一样并保存最新的数据和版本号(这就是乐观锁,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是会在更新数据的时候根据版本号判断一下,这期间是否有人修改过数据,乐观锁适用于多读的应用 类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。);

        悲观锁和乐观锁的对比:

        两种锁各有优缺点,我们要冷静合理的进行运用,像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。

参考:http://blog.csdn.net/hongchangfirst/article/details/26004335

分享到:
评论

相关推荐

    数据库事务、hibernate悲观锁和乐观锁

    在处理并发问题时,Hibernate提供了悲观锁和乐观锁两种机制。 悲观锁假设并发环境中的冲突是常态,因此在读取数据时就立即锁定,直到事务结束才释放。在Hibernate中,可以通过设置`@LockModeType.PESSIMISTIC_READ`...

    Hibernate悲观锁和乐观锁的实现

    悲观锁和乐观锁是两种常见的锁定策略,它们各有特点,适用于不同的场景。 **悲观锁**(Pessimistic Lock)的名字来源于其悲观的态度,它认为数据随时可能被其他事务修改,因此在读取数据时就立即进行加锁,防止其他...

    Java 中的悲观锁和乐观锁的实现

    悲观锁和乐观锁各有优缺点,选择哪种锁机制取决于具体的应用场景和需求。悲观锁适合数据修改频繁且对数据一致性要求较高的场景;而乐观锁适用于数据修改较少且并发量较大的场景。在实际应用中,可以根据具体情况灵活...

    Hibernate锁机制_悲观锁和乐观锁

    Hibernate 锁机制_悲观锁和乐观锁 Hibernate 锁机制是指在... Hibernate 的锁机制可以分为悲观锁和乐观锁两种,悲观锁通过数据库层次的锁定来实现,而乐观锁通过应用程序上的逻辑实现版本控制的方法来维护正确的数据。

    并发控制—悲观锁和乐观锁

    并发控制—悲观锁和乐观锁

    悲观锁和乐观锁的技术对比和应用.docx

    悲观锁和乐观锁是两种常见的并发控制策略,用于在多任务环境下确保数据一致性。它们各自有不同的工作原理和适用场景。 悲观锁(Pessimistic Lock)正如其名,它假设并发环境中会发生频繁的冲突,因此在读取数据时就...

    十三、关于悲观锁和乐观锁.xmind

    十三、关于悲观锁和乐观锁

    Hibernate实现悲观锁和乐观锁代码介绍

    Hibernate 实现悲观锁和乐观锁代码介绍 Hibernate 是一个基于 Java 的持久层框架,它提供了多种锁机制来实现事务的隔离性和一致性。在本文中,我们将详细介绍 Hibernate 实现悲观锁和乐观锁的代码实现,并讨论 ...

    36谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?

    36谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?

    悲观锁和乐观锁.md

    所谓乐观锁,重视假设最好的情况,每次去拿数据都认为别人不会修改,所以不会上锁,但是会在更新时判断一下在此期间这个数据有没有更改,使用版本号机制和CAS算法实现,乐观锁适用于多读的应用类型,这样可以提高...

    乐观锁与悲观锁

    介绍数据库事务的定义和事务带来的问题,详细讲解乐观锁与悲观锁的区别

    面试必备之乐观锁与悲观锁.pdf

    ### 面试必备之乐观锁与悲观锁详解 #### 一、悲观锁与乐观锁的概念 悲观锁和乐观锁是计算机科学中用于处理并发控制的两种不同策略,它们主要应用于多线程环境下数据的一致性和完整性保护。两种锁的设计哲学反映了...

    Hibernate悲观锁与乐观锁案例

    在Java的持久化框架Hibernate中,悲观锁和乐观锁是两种重要的并发控制策略,它们用于管理数据库中的数据在多线程环境下的访问安全。本文将深入探讨这两种锁机制的原理、应用场景及其区别。 首先,我们来理解悲观锁...

    thinkPHP框架乐观锁和悲观锁实例分析

    在ThinkPHP框架中,常见的有乐观锁和悲观锁两种机制。本文将通过实例分析这两种锁在ThinkPHP框架中的应用,以及它们各自的优缺点。 首先,让我们从乐观锁开始了解。乐观锁机制假设多个事务在处理数据时很少发生冲突...

    Hibernate悲观锁与乐观锁

    总结来说,Hibernate的悲观锁和乐观锁是两种不同的并发控制策略,悲观锁倾向于预防并发冲突,适合并发较低但需要保证数据一致性的情景;而乐观锁则在并发较高的情况下更优,通过版本控制减少锁定,但在冲突处理上...

    面试必备之乐观锁与悲观锁

    【描述】:“面试必备之乐观锁与悲观锁.pdf”涉及的是并发控制中的两种重要锁机制——悲观锁和乐观锁,它们是多线程环境下确保数据一致性的重要手段。 【标签】:“求职面试 多线程” 【正文】: 悲观锁和乐观锁...

Global site tag (gtag.js) - Google Analytics