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.mzph.cn/bicheng/39170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git 禁止dev合并到任何其他分支

创建 pre-merge-commit 钩子 导航到 Git 仓库的钩子目录&#xff1a; cd /path/to/your/repo/.git/hooks创建或编辑 pre-merge-commit 钩子&#xff1a; 也可以通过指令创建 nano pre-merge-commit在钩子文件中添加以下代码&#xff1a; #!/bin/sh# 获取当前分支名称 curr…

矮油,希喂、喜崽、爱立方主食冻干是超贵的进口平替?最新测评

相信很多铲屎官一到选粮就苦恼&#xff0c;尤其是主食冻干&#xff0c;虽说主食冻干对猫咪的好处是普通猫粮无法比的&#xff0c;其价格也是远超普通猫粮的。所以很多铲屎官就很担心&#xff0c;花了高价买的主食冻干却营养不高。其实除了营养还有更多需要考虑的&#xff0c;比…

Spring Boot与Solr的集成应用

Spring Boot与Solr的集成应用 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来聊聊Spring Boot与Solr的集成应用。Solr是一个高性能的开源搜索平台&am…

proto的前后端使用

首先定义一个input.proto文件 内容如下 syntax "proto3";message InputData {int32 UserId 1; // 将 number 改为 int32 或 int64string UserInput 2;string DrunkState 3; }message ResponseData {string AIResponse 1;string prompt 2;string emoti…

VBA提取word表格内容到excel

这是一段提取word表格中部分内容的vb代码。 Sub 提取word表格() mypath ThisWorkbook.Path & "\"myname Dir(mypath & "*.doc*")n 4 index of rowsRange("A1:F1") Array("课程代码", "课程名称", "专业&…

Linux miniconda 安装tensorflow-gpu遇到找不到GPU问题

背景&#xff1a; Linux Miniconda python3.9 安装步骤 1、 pip install tensorflow-gpu2.8.0 -i https://pypi.tuna.tsinghua.edu.cn/simple 2、报错如下&#xff1a; 更换镜像源&#xff0c;单独安装 pip install tf-estimator-nightly2.8.0.dev2021122109 -i https:/…

Java中的机器学习模型集成与训练实践

Java中的机器学习模型集成与训练实践 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 机器学习模型集成概述 在实际应用中&#xff0c;机器学习模型的集成与训…

主从同步binlog

主从同步的原理是怎样的 提到主从同步的原理&#xff0c;我们就需要了解在数据库中的一个重要日志文件&#xff0c;那就是 Binlog 二 进制日志&#xff0c;它记录了对数据库进行更新的事件。实际上主从同步的原理就是基于 Binlog 进 行数据同步的。在主从复制过程中&#xff…

【2024】LeetCode HOT 100——二分查找

目录 1. 搜索插入位置1.1 C++实现1.2 Python实现1.3 时空分析2. 搜索二维矩阵2.1 C++实现2.2 Python实现2.3 时空分析3. 在排序数组中查找元素的第一个和最后一个位置3.1 C++实现3.2 Python实现3.3 时空分析4. 搜索旋转排序数组4.1 C++实现4.2 Python实现4.3 时空分析5. 寻找旋…

在U盘/移动硬盘上安装热插拔式Ubuntu系统,并将Docker目录挂载到NTFS硬盘

Windows10的WSL2的确给开发人员带来了很多方便&#xff0c;但是仍然有很多缺点。比如&#xff1a;太占系统内存&#xff1b;有些软件无法在WSL2中编译成功&#xff1b;相当于虚拟机&#xff0c;性能不如原装系统。 装双系统&#xff0c;相信大家都不陌生&#xff0c;但它会占用…

SpringBoot 项目整合 MyBatisPlus 框架,附带测试示例

文章目录 一、创建 SpringBoot 项目二、添加 MyBatisPlus 依赖三、项目结构和数据库表结构四、项目代码1、application.yml2、TestController3、TbUser4、TbUserMapper5、TestServiceImpl6、TestService7、TestApplication8、TbUserMapper.xml9、MyBatisPlusTest 五、浏览器测试…

网安小贴士(3)网安协议

一、前言 网络安全协议是构建安全网络环境的基础&#xff0c;它们帮助保护网络通信免受各种威胁和攻击。 二、定义 网络安全协议是指在计算机网络中用于确保网络通信和数据传输安全的协议。它们定义了在网络通信过程中的安全机制、加密算法、认证和授权流程等&#xff0c;以保…

为什么 [] == ![] 为 true?

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 前言 面试官问我&#xff0c;[] ![] 的结果是啥&#xff0c;我&#xff1a;蒙一个true&#xff1b; 面试官&#xff1a;你是对的&#xff1b;我&#xff1a;内心非常高兴&a…

继承QAbstractListModel,结合QListView

这里想要写一个QAbstractListModel的子类&#xff0c;学习一下如何实例化QAbstractListModel。 QAbstractListModel子类化-CSDN博客 QVariant与自定义类型互转之奇巧淫技_qt 类型转 qvariant-CSDN博客 #pragma once#include <QStyledItemDelegate> #include <qmeta…

Python:Pycharm安装指南

三、Pycharm安装指南 在开始之前今天内容之前&#xff0c;将上篇的初体验练习题公布如下&#xff1a; 初体验练习题&#xff1a;输入两个字符&#xff0c;将他们组合后输出。 str1 input("请输入名字&#xff1a;") str2 input("请输入城市&#xff1a;&qu…

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

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

Lumerical Script 算法,查找数组中对应值的所有索引值

Lumerical Script 算法,查找数组中对应值的所有索引值 正文正文 比如,有一个数组如下: A = [0.5, 0.5, 0.5, 1, 2, 3];我们想要获取数组 A 中所有等于0.5 的值对应的索引值。 print(find(A ==

总结:Linux用户权限管理

一、背景 经常会涉及到某某用户没有权限操作、环境不一样等问题,不明白,本文详细记录下学习过程。 二、目录和文件权限 1、初步案例 我通过 ll命令 查看到data目录: [root@weiwei-vm-dev-1aa9cbe27 /]# ll drwxrwxrwx 9 root root 4096 Jun 26 15:35 data id hubbl…

游戏AI的创造思路-技术基础-tanh函数详解

又来搞事情&#xff0c;总想着把sigmoid函数替换成其他函数作为激活函数&#xff0c;或者找到更合适某一段训练的函数&#xff0c;所以今天来聊聊tanh函数&#xff08;谁让咱当年差点去了数学系&#xff0c;结果还是在数学系转过去计算机的&#xff09; 目录 3.9. tanh函数详解…

反向沙箱技术:安全隔离上网

在信息化建设不断深化的今天&#xff0c;业务系统的安全性和稳定性成为各公司和相关部门关注的焦点。面对日益复杂的网络威胁&#xff0c;传统的安全防护手段已难以满足需求。深信达反向沙箱技术&#xff0c;以其独特的设计和强大的功能&#xff0c;成为保障政务系统信息安全的…