EFCore_悲观锁与乐观锁(MySQL)

简述

悲观锁:对并发可能导致的资源抢占问题持悲观态度,总是认为会有其他的线程来抢占资源,所以会在实际上对资源上锁

乐观锁:对并发可能导致的资源抢占问题持乐观态度,并不对资源实际上锁,而是在对资源进行更新时,对表中的并发令牌(单字段并发控制)或行版本字段(多字段并发控制)进行一致性检测(是否与开始读取该资源时一致),若一致则认为此时不存在资源抢占问题,进而更新数据(更新数据时会一同更新行版本字段)

悲观锁

悲观锁实际上是通过MySQL的 for update 语句实现的
优点: 简单
缺点: 使用不当会严重影响性能甚至造成死锁
所以实际上更推荐使用乐观锁

示例:

internal class Program
{
    static void Main(string[] args)
    {
        using ThisDbContext dbContext = new();
        
        using var tr = dbContext.Database.BeginTransaction(); // 开启事务
        
        // 加锁(for update语法会添加行锁)
        var result = dbContext.Books.FromSqlInterpolated($"select * from books where price > 0 for update");
        ///
        Thread.Sleep(3000);
        if (result.Any())
        {
            result.ForEachAsync(e =>
            {
                e.Price += 1;
                Console.WriteLine(e.ToString());
            });
        }
        else
        {
            Console.WriteLine("books not found");
        }
        ///
        // 解锁
        dbContext.SaveChanges();
        // 提交事务
        tr.Commit();
        Console.ReadLine();
    }
}

乐观锁:单字段并发控制

实体类对应的配置类中设置并发令牌:

builder.Property(e => e.Price).IsConcurrencyToken(); // 设置并发令牌

对字段执行更新前,会检测字段的当前值与读取数据时的值是否相等,若相等则认为不存在并发冲突,可以进行更新,否则认为存在并发冲突,抛出异常(DbUpdateConcurrencyException)

示例:

internal class Program
{
    static void Main(string[] args)
    {
        using ThisDbContext dbContext = new();

        var result = dbContext.Books.Where(e => e.Price >= 1).SingleOrDefault();
        Thread.Sleep(3000);
        if (result != null)
        {
            try
            {
		        // 此处进行更新操作

		        // ---------------
                dbContext.SaveChanges();
                Console.WriteLine("数据更新完成");
            }
            catch (DbUpdateConcurrencyException ex)
            {
                Console.WriteLine("并发冲突");
                // 获取发生并发冲突时的数据实体
                var enrty = ex.Entries[0];
                var nowId = enrty.GetDatabaseValues().GetValue<int>("Id");
                //var nowId = enrty.GetDatabaseValuesAsync().Result.GetValue<int>("Id");
                Console.WriteLine($"并发冲突发生于Id: {nowId}的数据");
            }
        }
        else
        {
            Console.WriteLine("不存在符合条件的数据");
        }

        Console.ReadLine();
    }
}

注意点:

1. 捕获DbUpdateConcurrencyException异常并处理

2. 通过异常实例可以获取发生并发冲突时的数据实体

单字段并发控制无法识别ABA问题,且单字段的并发控制存在其局限性,所以通常推荐使用多字段并发控制

乐观锁:多字段并发控制

1.实体类添加行版本属性:

public byte[] RowVersion { get; set; }

版本控制属性的类型必需为byte[],在表中对应的行版本字段类型为timestamp(6)

2.实体类对应的配置类中设置行版本字段:

builder.Property(e => e.RowVersion).IsRowVersion();

当任意数据被更新时,行版本属性对应的表字段---行版本字段也会被更新(行版本字段的更新EFCore控制,无需人工更新)

并发状态下EFCore通过比对前后获得的行版本是否相同来判断是否存在并发冲突,以此实现并发控制

示例略

题外话

timestamp(6)在极高的并发情况下存在精度隐患,若想规避该隐患可将并发令牌设置为Guid,并在执行SaveChanges()之前人工更新并发令牌(注意,是并发令牌,在实体类对应的配置类中通过IsConcurrencyToken()设置)

该方式实质上是单并发控制,但只要记得在每次更新数据时都更新并发令牌,是可以实现多并发控制的效果的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/766049.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java Character类

Character是char的包装类 转义序列 Character类的方法

SpringSecurity中文文档(Servlet Persisting Authentication)

Persisting Authentication 用户第一次请求受保护的资源时&#xff0c;系统会提示他们输入凭据。提示凭据的最常见方法之一是将用户重定向到登录页。对于请求受保护资源的未经身份验证的用户&#xff0c;总结的 HTTP 交换可能如下所示: Example 1. Unauthenticated User Requ…

机器人控制系列教程之Simulink中模型搭建(1)

机器人模型获取 接上期&#xff1a;机器人控制系列教程之控制理论概述&#xff0c;文中详细讲解了如何通过Solidworks软件导出URDF格式的文件。文末提到了若需要将其导入到Simulink中可在命令行中输入smimport(urdf/S_Robot_urdf.urdf)&#xff0c;MATLAB将自动打开Simulink以…

【揭秘】国内十大顶尖AI大模型,引领智能科技新纪元

大模型大模型通常指的是参数量非常大、数据量也非常大的深度学习模型。这些模型由数百万到数十亿甚至更多的参数组成&#xff0c;需要海量的数据和强大的计算资源进行训练和推理学习的模型。大模型设计的目的在于提高模型的表示能力和性能、应对复杂数据集和任务、提升泛化能力…

65.WEB渗透测试-信息收集- WAF、框架组件识别(5)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;64.WEB渗透测试-信息收集- WAF、框架组件识别&#xff08;4&#xff09;-CSDN博客 waf绕…

c语言的烫烫烫烫烫??

当初学习C语言时&#xff0c;对于一些特殊的打印输出可能会感到困惑&#xff0c;比如会出现一堆乱码烫烫烫的情况。其实这是因为在C语言中&#xff0c;对于字符类型和数字类型之间的隐式转换可能会导致打印输出的结果不符合预期。这并不意味着程序员"烫"&#xff0c;…

详解归一化、标准化、正则化以及batch normalization

文章目录 what(是什么)where&#xff08;用在哪&#xff09;How&#xff08;如何用&&原理&#xff09;归一化实现方式原理示例说明 标准化实现方式原理示例说明 正则化实现方式原理作用 Batch Normalizationpytorch中的batch normalization原理BN的作用 归一化、标准化…

EXCEL怎么一模一样复制粘贴?

第一步 鼠标选中复制子表 右击建立副本 第二步 建立好副本表格 第三步 将选定工作表移动至新表格 第四步 成功完成移动

社区的用户分层运营如何做?

在社区运营中用户分层尤为关键&#xff0c;20%的高粘性用户带动80%的普通用户。我们主要围绕的是这20%的粘性用户&#xff0c;因为他们才是决定我们未来能不能最好做大最重要的人 分层运营策略 1️⃣对普通用户&#xff1a; &#x1f4da;满意&#xff1a;搜索是内容多而全&…

数据结构 -AVL树

文章目录 AVL树左旋和右旋插入的四种情况&#xff08;一&#xff09;新数字插到了左子树&#xff0c;导致左子树比右子树高2&#xff1b;左孩子的左子树比其右子树高1&#xff08;二&#xff09;新数字插到了左子树&#xff0c;导致左子树比右子树高2&#xff1b;左孩子的右子树…

linux的Top学习

学习文档 https://www.cnblogs.com/liulianzhen99/articles/17638178.html TOP 问题 1&#xff1a;top 输出的利用率信息是如何计算出来的&#xff0c;它精确吗&#xff1f; top 命令访问 /proc/stat 获取各项 cpu 利用率使用值内核调用 stat_open 函数来处理对 /proc/sta…

蓝桥杯算法双周赛

四、赛后真题解析 比赛赛后将提供免费直播讲解&#xff0c;主讲人&#xff1a;待定。时间&#xff1a;07 月 13 日&#xff08;比赛当日&#xff09;晚 21 时。观看直播地址&#xff1a;第3场蓝桥算法季度赛赛后题解直播 - 蓝桥云课 - 哔哩哔哩直播&#xff0c;二次元弹幕直播…

ShareSDK HarmonyOS NEXT集成指南

集成前准备 注册账号 使用MobSDK之前&#xff0c;需要先在MobTech官网注册开发者账号&#xff0c;并获取MobTech提供的AppKey和AppSecret&#xff0c;详情可以点击查看注册流程 ShareSDK流程图 集成配置 添加依赖 在Terminal窗口中&#xff0c;执行如下命令进行安装 ohpm …

彻底搞懂Webpack插件

前言 首先我们先回忆一下Webpack插件是如何使用的&#xff1f;下面是一份基础的Webpack配置文件&#xff1a; let htmlWebpackPlugin require(html-webpack-plugin);module.exports {mode: development,entry: {main: path.join(__dirname, src/index.js)},output: {path: …

认识软件测试

认识软件测试 软件测试能力要求一、软件测试的步骤1.需求2.测试点3.测试用例4.执行测试用例5.缺陷管理6.测试报告 一、测试用例&#xff08;test case&#xff09;**用例编写要素**&#xff1a; 测试用例设计方法1.等价类2.边界值3.判定表法4.场景法 软件测试能力要求 软件测试…

张颂文百花提名,男配界笑出“颂”彩

在这个星光熠熠的百花奖舞台上&#xff0c; 张颂文老师犹如一坛陈年老酒&#xff0c;越品越有味&#xff0c; 竟不声不响地提名了最佳男配角&#xff01;这下可好&#xff0c; 男配界仿佛一夜之间被“颂”风吹得花枝乱颤&#xff0c;笑料百出。你说张颂文老师这演技&#xf…

嵌套组合请求对象的校验与全局捕捉

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

怎么压缩图片大小?6种无需牺牲质量的图片压缩方法

经常处理图片的小伙伴都知道&#xff0c;高质量的图片往往会占据电脑大量的存储空间&#xff0c;导致图片传输及存储的不便。因此&#xff0c;掌握如何压缩图片大小变得尤为重要。本文将详细介绍图片压缩的几种方法&#xff0c;帮助你高效地减小图片文件大小&#xff0c;让你的…

【ACM出版,马来西亚-吉隆坡举行】第四届互联网技术与教育信息化国际会议 (ITEI 2024)

作为全球科技创新大趋势的引领者&#xff0c;中国不断营造更加开放的科技创新环境&#xff0c;不断提升学术合作的深度和广度&#xff0c;构建惠及各方的创新共同体。这是对全球化的新贡献&#xff0c;是构建人类命运共同体的新贡献。 第四届互联网技术与教育信息化国际学术会议…

秒懂设计模式--学习笔记(5)【创建篇-抽象工厂】

目录 4、抽象工厂4.1 介绍4.2 品牌与系列&#xff08;针对工厂泛滥&#xff09;(**分类**)4.3 产品规划&#xff08;**数据模型**&#xff09;4.4 生产线规划&#xff08;**工厂类**&#xff09;4.5 分而治之4.6 抽象工厂模式的各角色定义如下4.7 基于此抽象工厂模式以品牌与系…