精华内容
下载资源
问答
  • 数据库悲观锁乐观锁的理解和实现

    千次阅读 多人点赞 2021-03-30 19:24:40
    什么是乐观锁悲观锁?这其实是人们定义出的一种思想,可以对应为在生活中乐观的人和悲观的人。乐观锁总是相信最好的情况,去相信别人不会修改自己的数据,在每次取数据的时候都不会上锁,因此比较适用于读多写少的...

    什么是乐观锁和悲观锁?这其实是人们定义出的一种思想,可以对应为在生活中乐观的人和悲观的人。乐观锁总是相信最好的情况,去相信别人不会修改自己的数据,在每次取数据的时候都不会上锁,因此比较适用于读多写少的情况。而悲观锁恰恰相反,总是担心别人会去修改自己的数据,所以在每一次取数据时都会上锁,比较适用于写多读少的情况。

    • 悲观锁
      首先我们来了解一下悲观锁,悲观锁认为被它保护的数据不安全的,随时都有可能变动,一个进程或线程拿到悲观锁后,其他的进程或线程都不能对该数据进行修改,只能等待锁被释放,下一个拿到锁的进程才能进行修改。悲观锁是“先取锁再访问”的保守策略,为数据处理的安全提供了保证。但是在效率方面,处理加锁的机制会产生额外的开销,还有增加产生死锁的机会。另外还会降低并行性,一个进程或线程如果锁定了某个数据,其他进程或线程就必须等待其处理完才可以处理那个数据。
      悲观锁的实现
      1.传统的关系型数据库使用这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
      2.Java 里面的 synchronized和ReentrantLock独占锁也属于悲观锁。
    • 乐观锁
      乐观锁的乐观是相对于悲观锁而言的,乐观锁的乐观体现在,它认为数据的变动不会太频繁,因此它允许多个进程或线程同时对数据进行访问和修改。但是乐观锁也不是毫无安全性可言,乐观锁会在数据进行提交更新的时候去判断别人有没有去修改这个数据。如果发现出现了冲突,则返回给用户错误的信息,让用户重新去操作。乐观锁机制采取了更宽松的加锁机制,适用于读操作多的情况,可以提高程序的吞吐量,不会产生死锁的情况。
      乐观锁的实现
      CAS 实现:Java 中java.util.concurrent.atomic包下面的原子变量使用了乐观锁的一种 CAS 实现方式。
      版本号控制:通常是在数据表中加上一个数据版本号 version 字段,表示数据被修改的次数。当数据被修改时,version 值会+1。当线程A要更新数据值时,在读取数据的同时也会读取 version 值,在提交更新时,若刚才读取到的 version 值与当前数据库中的 version 值相等时才更新,否则重试更新操作,直到更新成功。
      乐观锁与悲观锁的对比与选择
      1.响应效率:如果需要高响应速度,推荐使用乐观锁,成功就执行,不成功就失败,不需要等待其他进程去释放锁。
      2.冲突频率:如果冲突频率高,推荐使用悲观锁,保证成功率。冲突频率高的话,选择乐观锁会需要多次重试才能成功,代价较大。
      3.重试代价:如果重试代价大,推荐使用悲观锁。悲观锁依赖数据库锁,虽然效率较低,但失败的概率也比较低。
      4.还有一点区别是,使用乐观锁如果有人在你之前更新了数据,那么你的更新是被拒绝的,返回至用户重新操作,而悲观锁则会等待前一个进程把数据更新完成,再去进行操作。
    展开全文
  • 乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。在查询完数据的时候就把事务锁起来,直到提交事务。实现方式:...

    数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。

    悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。在查询完数据的时候就把事务锁起来,直到提交事务。实现方式:使用数据库中的锁机制乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。在修改数据的时候把事务锁起来,通过version的方式来进行锁定。实现方式:乐一般会使用版本号机制或CAS算法实现。

    两种锁的使用场景从上面对两种锁的介绍,我们知道两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下(多读场景),即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。

    但如果是多写的情况,一般会经常产生冲突,这就会导致上层应用会不断的进行

    retry,这样反倒是降低了性能,所以一般多写的场景下用悲观锁就比较合适

    展开全文
  • 数据库乐观锁悲观锁 演示案例 为何需要乐观锁,与悲观锁这样的锁? id name money 1 god 1000 假设god同志的账上有1000元,现在有两个线程同时往他的账户上转钱。 1.A线程准备向god账户上转200,读取到...

    数据库乐观锁与悲观锁

    演示案例

    为何需要乐观锁,与悲观锁这样的锁?

    idnamemoney
    1god1000

    假设god同志的账上有1000元,现在有两个线程同时往他的账户上转钱。

    1.A线程准备向god账户上转200,读取到账户上有1000元,事务还未提交

    2.B线程准备向god账户上转100,读取到账户上有1000元,事务也还未提交

    3.A线程提交了事务,god账户上变成了1200元,但是B线程此时不知道god账户上变成了1200

    4.B线程随即也提交了事务,god账户上变成了1200,少了100元

    因此,加锁的目的在于保障一个线程修改数据时,这个数据没有被其他的线程修改过

    悲观锁与乐观锁的区别

    1.在事务的基础上,悲观锁更适合短事务(长事务导致其他事务一直被阻塞,影响了系统性能),适用于查少改多

    2.在事务的基础上,乐观锁更适合长事务,他的本质并不是锁,而是通过代码实现的。适用于查多改少

    悲观锁的使用案例

    在查的时候,对数据进行锁定。

    在数据库中:for update

    在Django中:select_for_update()

    原生的sql:

    1 开启事务

    2 查询的时候加锁 —》 select * from user where id =1 for update

    3 结束事务锁被释放

    django中:

    1 开启事务

    2 在查询的时候 —》 user.objects.select_for_update().flilter(id=1).first()

    3 事务结束锁被释放

    乐观锁的使用案例

    乐观锁的本质不是锁。他是通过代码来实现锁的。

    方法:先拿到age数据,在修改的时候再次判断age是否一样。

    (代码实现)目的:将这个数据中的age在原来的基础上+1

    1 开启事务

    2 查询的时候不做任何操作。data = user.objects.flilter(id=1).first()

    3 在修在数据的时候。user.objects.filter(id=1,age=data.age).updata(age=data.age+1)

    从而在我查询到我修改的时候,没有人改动过

    4 如果3中的影响行数为0,证明数据被人修改。循环再次执行。如果为1,证明数据没人动过,修改成功

    ‘’’ 如果是可重复读,上面的乐观锁无效,必须改成read committed’’’

    展开全文
  • 1、悲观锁,先获取锁,再进行业务操作,一般就是利用类似 SELECT … FOR UPDATE 这样的语句,对数据加锁,避免其他事务意外修改数据。 当数据库执行SELECT … FOR UPDATE时会获取被select中的数据行的行锁,select ...

    1、悲观锁,先获取锁,再进行业务操作,一般就是利用类似 SELECT … FOR UPDATE 这样的语句,对数据加锁,避免其他事务意外修改数据。

    当数据库执行SELECT … FOR UPDATE时会获取被select中的数据行的行锁,select for update获取的行锁会在当前事务结束时自动释放,因此必须在事务中使用。

    2、乐观锁,先进行业务操作,只在最后实际更新数据时进行检查数据是否被更新过。Java 并发包中的AtomicFieldUpdater 类似,也是利用 CAS 机制,并不会对数据加锁,而是通过对比数据的时间戳或者版本号,来实现乐观锁需要的版本判断。

    展开全文
  • 数据库中的乐观锁悲观锁详解

    千次阅读 2021-02-20 15:23:15
    这种借助数据库锁机制在修改数据之前先锁定,再修改的方式被称之为悲观并发控制(又名“悲观锁”,Pessimistic Concurrency Control,缩写“PCC”)。 之所以叫做悲观锁,是因为这是一种对数据的修改抱有悲观态度的...
  • 锁锁是网络数据库中的一个非常重要的概念,当多个用户同时对数据库并发操作时,会带来数据不一致的问题,所以,锁...从程序员角度分为两种:一种是悲观锁,一种乐观锁悲观锁(Pessimistic Lock)顾名思义,很悲观,...
  • Mysql数据库加锁方式一、乐观锁二、悲观锁背景在高并发的场景中我们经常会让线程同步,如在秒杀商品时,我们需要对资源上锁来确保不发生超卖等问题,在单体应用中java已经为我们提供了相应的同步锁。然而,在分布式...
  • 浅谈数据库乐观锁

    2021-01-19 06:22:45
    假设有如下场景,有两处火车票售票点,同时读取某一趟列车车票数据库中车票余额为 X。两处售票点同时卖出一张车票,同时修改余额为 X -1写回数据库,这样就造成了实际卖出两张火车票而数据库中的记录却只少了一张。...
  • 数据锁分为乐观锁悲观锁,那么它们使用的场景如下:1. 乐观锁适用于写少读多的情景,因为这种乐观锁相当于JAVA的CAS,所以多条数据同时过来的时候,不用等待,可以立即进行返回。2. 悲观锁适用于写多读少的情景,...
  • 数据库乐观锁悲观锁乐观锁适用场景定义实现方式优点与缺点分析悲观锁适用场景定义实现方式优点与缺点分析 作者: 齐大圣2012 链接: https://blog.csdn.net/qidasheng2012/article/details/83007103 来源: CSDN...
  • 悲观锁,就是对数据的冲突采取一种悲观的态度,也就是说假设...悲观锁通常依靠数据库提供的锁机制实现,比如 mysql 的排他锁,select … for update 来实现悲观锁乐观锁不依靠数据库提供的锁机制,需要我们自已实
  • 在了解悲观锁乐观锁之前,我们先了解一下什么是锁,为什么要用到锁? 技术来源于生活,锁不仅在程序中存在,在现实中我们也随处可见,例如我们上下班打卡的指纹锁,保险柜上的密码锁,以及我们我们登录的用户名和...
  • 前言:在并发访问情况下,可能会出现脏读、不可重复读和幻读等读现象,为了...乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。无论是悲观锁还是乐观锁,都是人们定义出来的概念,可以认...
  • 转载出处:http://www.hollischuang.com/archives/934...乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。无论是悲观锁还是乐观锁,都是人们定义出来的概念,可以认为是一种思想。其实不仅...
  • 数据库乐观锁解决并发更新4. 乐观锁 CAS 的 ABA 问题5. 拓展思考5.1. 悲观锁和排他锁、乐观锁和 CAS 分别有什么区别5.2. 悲观锁和乐观锁适用场景5.3. 乐观锁是否必须加版本号或时间戳字段 1. 问题引出 假设现在有...
  • [数据库]mysql乐观锁悲观锁详解0 2021-01-26 20:01:06mysql乐观锁悲观锁详解相信很多朋友在面试的时候,都会被问到乐观锁悲观锁的问题,如果不清楚其概念和用法的情况下,相信很多朋友都会感觉很懵逼,那么...
  • 本文主要向大家介绍了MySQL数据库之数据库乐观锁的两种实现方式介绍 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。什么场景下需要使用锁?在多节点部署或者多线程执行时,同一个时间可能有多个...
  • 乐观锁悲观锁概述乐观锁总是假设最好的情况,每次去读数据的时候都认为别人不会修改,所以不会上锁, 但是在更新的时候会判断一下在此期间有没有其他线程更新该数据, 可以使用版本号机制和CAS算法实现。 乐观锁...
  • 标 题: 【合集】为什么乐观锁效率高于悲观锁?发信站: 饮水思源 (2008年05月19日12:29:00 星期一), 站内信件☆──────────────────────────────────────☆magiczhang (梅西,...
  • 正文前言:在并发访问情况下,可能会出现脏读、不可重复读和幻读等读现象,为了...乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。无论是悲观锁还是乐观锁,都是人们定义出来的概念,可...
  • 基本上悲观锁就是数据库层面上的数据安全操作,最常见的就是利用 for update 。 例如Mysql的行级锁和表级锁 在使用 select…for update 的时候会把数据给锁住 ,但是锁可能是行级锁也可能是表级锁,语句使用不当...
  • golang的乐观锁悲观锁

    千次阅读 2021-09-23 10:15:55
    golang的乐观锁悲观锁基本概念 基本概念 乐观锁悲观锁是两种思想,用于解决并发场景下的数据竞争问题。 乐观锁乐观锁在操作数据时非常乐观,认为别人不会同时修改数据。因此乐观锁不会上锁,只是在执行...
  • 何谓悲观锁与乐观锁悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用...
  • 前言mysql的并发操作时而引起的数据的不...2.乐观锁,假设丢失更新不一定发生。update时候存在版本,更新时候按版本号进行更新。第一部分 悲观锁1 概念悲观锁,正如其名,它指的是对数据被外界(包括当前系统的其它事...
  • 一个典型的倚赖数据库悲观锁调用:select * from account where name=”Erica” for update这条 sql 语句锁定了 account 表中所有符合检索条件( name=”Erica” )的记录。本次事务提交之前(事务提交时会释放事务...
  • 数据库管理系统中并发控制的任务是确保在多个事务同时存取数据库中同一数据不破坏事务的隔离性和统一性以及数据库的统一性乐观锁悲观锁式并发控制主要采用的技术手段悲观锁在关系数据库管理系统中,悲观并发控制...
  • 前言在数据库的实际使用过程中,我们常常会遇到不希望数据被同时写或者读的情景,例如秒杀场景下,两个请求同时读到系统还有库存1个,然后又先后把库存更新为0,这时候就会...其中乐观并发控制,悲观并发控制和多版...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 48,820
精华内容 19,528
关键字:

数据库乐观锁悲观锁