首页 > 其他分享 >乐观锁和悲观锁!!!

乐观锁和悲观锁!!!

时间:2024-03-13 20:01:33浏览次数:17  
标签:转账 事务 版本号 乐观 悲观 操作 执行

概念

乐观锁:乐观锁实在执行线程任务时,不会直接加锁,而是在数据记录中添加一个版本号。当事务需要更新数据时,它会检查版本号是否与之前读取时相同。如果相同,则执行更新操作;如果不同,则说明有其他事务在此期间修改了数据,当前事务需要重新执行读取和更新操作。

悲观锁:悲观锁是在执行线程任务时直接加锁,以确保同一时刻只有一个线程可以访问共享资源。确保其他事务无法访问这些数据,直到锁被释放

使用场景:

  • 乐观锁:在商品库存表中,商品销售频繁,在更新库存信息时采用乐观锁。我们采用的方法是:给库存表的数据表添加一个标识字段——版本号(version),在每次执行入库的sql语句时,在执行条件中添加一个where条件判断version是否与之前读取的一致,如果满足,则修改对应内容以及版本号更新(如+1),如果不满足,则事务回滚,重新执行。
  • 悲观锁:在一个银行转账系统中,转账操作涉及从一个账户扣除金额并添加到另一个账户。这种操作对数据的一致性要求非常高,因为同时进行的转账操作可能会导致错误的余额计算。在这种情况下,可以使用悲观锁。当一个转账操作开始时,系统会锁定涉及的账户记录,确保在此期间其他转账操作无法修改这些记录。直到转账操作完成并释放锁后,其他事务才能继续进行。

标签:转账,事务,版本号,乐观,悲观,操作,执行
From: https://blog.csdn.net/qq_64847107/article/details/136655906

相关文章

  • MySQL实战:解密乐观并发控制,确保数据操作不冲突
     概述:乐观并发控制是处理数据访问并发的一种策略,通过在更新前检查版本号或时间戳,确保数据在事务间保持一致性。在MySQL示例中,通过比对版本号,如果发现其他事务已更新数据,则拒绝当前事务的修改,避免潜在的并发冲突。这种机制提高了数据一致性,典型应用包括乐观锁的实现。数据访问......
  • 悲观锁和乐观锁
    最近面试都被问到这个,可是都只是靠着零散的记忆不知说了啥,那就好好整理一趟吧。悲观锁:当我们要对一个数据库中的一条数据进行修改的时候,为了避免同时被其他人需改,最好的方法就是直接对该数据进行加锁以防止并发。这种借助数据库锁机制在修改数据之前先锁定,再修改的方式称之为悲......
  • sqlserver 数据库事务ACID和使用 数据库锁,悲观锁乐观锁死锁
    在SQLServer中,事务的ACID属性、数据库锁、悲观锁、乐观锁和死锁是数据库管理和设计中的重要概念。以下是对这些概念的详细解释以及如何在SQLServer中使用它们:1.ACID属性在SQLServer中,事务必须满足ACID属性,以确保数据的一致性和可靠性。原子性(Atomicity):......
  • C#和sqlserver 如何实现 事务ACID和使用 数据库锁,悲观锁乐观锁死锁
    在C#中使用SQLServer实现事务的ACID(原子性、一致性、隔离性、持久性)属性和使用数据库锁(悲观锁和乐观锁)时,你可以通过ADO.NET的SqlConnection和SqlTransaction类来实现。下面是一些示例和概念说明。实现ACID事务ACID属性是事务处理的四个基本特征,它们确保事务在数据库中的正确......
  • MySQL乐观锁与悲观锁
    说明遇见并发情况,需要保证数据的准确性,也就是与正确的预期一致,此时就会用到锁。锁是在并发下控制程序的执行逻辑,以此来保证数据按照预期变动。如果不加锁,并发情况下的可能数据不一致的情况,这是个概率问题。乐观锁CAS简介乐观锁很乐观,假设数据一般情况不会造成冲突,属于程序层......
  • 使用悲观锁防止超卖问题
    记录一次使用悲观锁防止超卖的demo实例。环境配置可以参照我上篇笔记此处只展示核心代码 代码//先查库存Devicedevice=deviceMapper.selectByIdUpdate(3);//核心为该行代码//Thread.sleep(3000);if(device.getSortNum()>0){System.out.println("当前库存是:"+......
  • 一个小小的乐观锁、悲观锁也能扯这么多
    前言:我们一个普通的下单接口通常都包含如下三步操作,如果下单不成功的话将会返回给用户一个提示下单失败。查询库存(selectstockfromxxwhereid=xx)扣减更新库存(updatexxsetstock=stock-1whereid=xx)生成订单如果是只有一个用户来请求下单接口,那么上述的操作毫无疑问......
  • php redis 悲观锁
    悲观锁(PessimisticLock),顾名思义,就是每次处理redis数据都以最悲观的场景展开,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做......
  • 乐观锁和悲观锁
    悲观锁认为⾃⼰在使⽤数据的时候⼀定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。synchronized关键字和Lock的实现类都是悲观锁适合写操作多的场景,先加锁可以保证写操作时数据正确。调用方式//=============悲观锁的调⽤⽅式publicsynch......
  • 悲观锁、乐观锁、mybatis-plus实现乐观锁
    转载自:www.javaman.cn1、悲观锁、乐观锁乐观锁和悲观锁是两种用于处理并发操作的数据锁定策略。它们在处理多个事务尝试同时访问和修改同一数据时的方法有所不同。悲观锁(PessimisticLocking):概念:悲观锁是一种基于悲观态度的数据并发控制机制。它总是假设最坏的情况,即认为其他......