【并发控制、更新、版本控制】.NET开源ORM框架 SqlSugar 系列

系列文章目录

🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀


文章目录

  • 系列文章目录
  • 一、并发累计(累加)
    • 1.1 单条批量累计+
    • 1.2 批量更新并且字段+1
    • 1.3 批量更新并且字段+list中对应的值
  • 二、防止提交覆盖,重复提交(乐观锁)
    • 2.1 不依赖库同步 (新功能)
    • 2.2 依赖库同步(老功能)
    • 2.3 一对多提交
  • 三、悲观锁的用法
    • 3.1 悲观锁等待模式
    • 3.2 悲观锁排它模式
    • 在这里插入图片描述
  • 🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀


一、并发累计(累加)

1.1 单条批量累计+

比如要扣钱什么的,或者数字叠加,这种就需要通过 set 字段=段字段+1 这种方处理。

//正确写法:安全的字段累计
var result= db.Updateable<Student>().SetColumns(it => it.Num== it.Num+1).Where(it => it.Id == 1).ExecuteCommand();
//sql: num=num+1 
 
 
//错误写法: 在程序中计算是不安全的
var num=data.num+1
var result= db.Updateable<Student>().SetColumns(it => it.Num== num).Where(it => it.Id == 1).ExecuteCommand();
//sql:  num=值

🎯注意:这种更新方式只适合明确主键的更新,条件形态的建议用下面的锁。

1.2 批量更新并且字段+1

 var result67 =
          db.Updateable(updateObjs)
          //批量更新单独处理num列 set num=num+1
          .PublicSetColumns(it => it.Num, it => it.Num+ 1)
          .ExecuteCommand();

1.3 批量更新并且字段+list中对应的值

   db.Updateable(list)
   PublicSetColumns(it => it.Price, "+") //set price=price+list[i].price
   .ExecuteCommand();

二、防止提交覆盖,重复提交(乐观锁)

📌使用乐观锁需要满足2个条件:

  1. 用户要打开编辑界面,然将数据绑定到编辑界面
  2. 用户在界面填写完在点修改保存

💯原理: 打开编辑框太久别人已经修改了这条记录,我在提交就可能把别人更新数据清空掉,我们需要一个时间字段去和数据库中的Version比对

🎇重现步骤:开2个浏览器 ,编辑同一条记录, A浏览器先保存,然后B浏览器在保存就能重现

因为是同一条记录本身并不存在并发,因为编辑界面打开一天也不会刷新数据,点保存一样覆盖

2.1 不依赖库同步 (新功能)

新项目推荐用新功能,使用方便有问题及时沟通

    public class ULockEntity
    {
        [SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int Id { get; set; }
        public string Name { get; set; }
        [SqlSugar.SugarColumn(IsEnableUpdateVersionValidation = true)]//标识版本字段
        public long Ver { get; set; } 
         
        //支持Guid long string DateTime (不推荐DateTime 时间有精度问题)
        //推荐用 string guid  (使用long要序列化成strting不然前端精度丢失)
    }
     
    //注意:只能是实体更新不能是集合更新
     
    //【用法1:不扔错】 Ver与数据库字段不同不报错返回0
    var rows = db.Updateable(new ULockEntity()
    {
        Id = id,
        Name = "newname",
        Ver = 1551128313597136896//版本字段会自动更新
    }).ExecuteCommandWithOptLock(); 
     
     
    //【用法2:扔出错误】Ver与数据库字段不同直接扔错出误
    var rows = db.Updateable(new ULockEntity()
    {
        Id = id,
        Name = "newname",
        Ver = 1551128313597136896  //版本字段会自动更新
    }).ExecuteCommandWithOptLock(true); //加上true就会扔出错误
    //try { ... }catch(VersionExceptions ex){...}
    //底层 throw new VersionExceptions
    
    /*********完整测试用例*********/
     
    //添加测试数据
    var db = NewUnitTest.Db;
    db.CodeFirst.InitTables<ULockEntity>();
    db.DbMaintenance.TruncateTable<ULockEntity>();
    //第一次插入ver=0
    var id = db.Insertable(new ULockEntity(){Name = "oldName" ,Ver=0}).ExecuteReturnIdentity();
     
    //开始用例
    var rows= db.Updateable(new ULockEntity()
    {
        Id = id,
        Name = "newname",
        Ver = 0  //会自动更新版本字段更新后数据库将不在是0
    }).ExecuteCommandWithOptLock();  
    //rows=1 因为数据库ver是0你传的也是0
 
    var rows= db.Updateable(new ULockEntity()
    {
        Id = id,
        Name = "newname2",
        Ver = 0
    }).ExecuteCommandWithOptLock();   
    //rows=0  失败:数据库ver不等于0

2.2 依赖库同步(老功能)

例如:SqlServer 中的时间戳类型的字段,会在这条记录变更后会自动更新,如果没这种机质的字段你也可以用触发器实现这种机质

有这种机质我们只要打个特性就能实现并发控制,代码如下:

数据库数据库实体
SQLSERVERtimestamp默认自动更新)byte[]
其他数据库timestamp(需要配置自动更新)DateTime

public class StudentVersion    
{
  [SugarColumn(IsPrimaryKey =true,IsIdentity =true)]    
 public int Id { get; set; }    
 public string Name { get; set; }    
 public DateTime CreateTime { get; set; }    
 [SqlSugar.SugarColumn(
             IsEnableUpdateVersionValidation = true,//标识版本字段 
             IsOnlyIgnoreInsert=true,//禁止插入
             IsOnlyIgnoreUpdate=true,//禁止更新
             ColumnDataType="timestamp" //时间戳类型,有些库需要配置或者有差异
              )]   
  
 // SqServer byte[] 其它数据库用 DateTime                        
 public byte[]  Timestamp { get; set; } 
}    
db.Updateable(data).IsEnableUpdateVersionValidation().ExecuteCommand();//更新的时候启用验证

原理:

 //查询这条记录
 var data = db.Queryable<StudentVersion>().InSingle(id);
  
 //成功 (data.Timestamp等于数据库中的 Timestamp字段)
 db.Updateable(data).IsEnableUpdateVersionValidation().ExecuteCommand();//执行后数据库Timestamp更新
  
 //失败 (data.Timestamp不等于数据库中的 Timestamp字段)
 db.Updateable(data).IsEnableUpdateVersionValidation().ExecuteCommand();

如何知道是并发错误,还是其他错误

//底层代码 
throw new VersionExceptions //捕获异常的时候只要是 VersionExceptions 那就是并发错误

2.3 一对多提交

只处理主表数据就行了,从表不需要考虑,因为是一起提交。

三、悲观锁的用法

悲观锁适合用于 读取和插入在同一个步骤下的操作,并且禁止2个请求同时操作

3.1 悲观锁等待模式

🎯定义:2个相同的业务代码 同时执行时必须等待 第一个执行成功后执行。

主键查询一般是行锁,如果非主键可以会变成表锁。


db.BeginTran();
//查询条件记录后锁表
var data=db.Queryable<Order>().TranLock(DbLockType.Wait).Where(it=>it.Id==1).ToList();//返回条数尽量最少尽量主键
//插入、更新等操作
.......
db.CommitTran();
 
//异常要加上
db.RollBackTran();

3.2 悲观锁排它模式

🎯定义:2个相同的业务代码 同时执行时只会生效一个,其它都扔出错误。

db.BeginTran();
//查询条件记录后锁表
var data = db.Queryable<Order>().TranLock(DbLockType.Error).Where(it=>it.Name=="a").ToList();//返回条数尽量最少 for update UPDLOCK
//插入、更新等操作 
.......
db.CommitTran();
 
//异常要加上
db.RollBackTran();

测试代码:

用的来验证是否扔出异常


for (int i = 0; i < 10; i++)
{
    Task.Run(() =>
    {
            var db = GetInstance();//用的sqlsugarclient保证db线程安全每次New一下
        try
        {
          
            db.BeginTran();
            var getAll = db.Queryable<Order>().TranLock(DbLockType.Error).ToList();
            System.Threading.Thread.Sleep(1000);
            db.CommitTran();
            Console.WriteLine("成功");
        }
        catch (Exception ex)
        {
            db.RollBackTran();
            Console.WriteLine("失败");
        }
    });
}

在这里插入图片描述

🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀

【开篇】.NET开源 ORM 框架 SqlSugar 系列
【入门必看】.NET开源 ORM 框架 SqlSugar 系列
【实体配置】.NET开源 ORM 框架 SqlSugar 系列
【Db First】.NET开源 ORM 框架 SqlSugar 系列
【Code First】.NET开源 ORM 框架 SqlSugar 系列
【数据事务】.NET开源 ORM 框架 SqlSugar 系列
【连接池】.NET开源 ORM 框架 SqlSugar 系列
【查询目录】.NET开源 ORM 框架 SqlSugar 系列
【查询基础】.NET开源 ORM 框架 SqlSugar 系列
【排序用法】.NET开源 ORM 框架 SqlSugar 系列
【分组去重】.NET开源 ORM 框架 SqlSugar 系列
【联表查询】.NET开源 ORM 框架 SqlSugar 系列
【导航查询】.NET开源 ORM 框架 SqlSugar 系列
【子查询】.NET开源 ORM 框架 SqlSugar 系列
【嵌套查询】.NET开源 ORM 框架 SqlSugar 系列
【配置查询】.NET开源 ORM 框架 SqlSugar 系列
【并集查询】.NET开源 ORM 框架 SqlSugar 系列
【树型查询】.NET开源 ORM 框架 SqlSugar 系列
【表格查询】.NET开源 ORM 框架 SqlSugar 系列
【动态表达式】.NET开源 ORM 框架 SqlSugar 系列
【查询函数】.NET开源ORM框架 SqlSugar 系列
【过滤器】.NET开源 ORM 框架 SqlSugar 系列
【跨库查询、多库查询】.NET开源 ORM 框架
​【报表查询】.NET开源ORM框架 SqlSugar 系列
【Where语法全解密】.NET开源ORM框架 SqlSugar 系列
【Select 语法全解密】.NET开源ORM框架 SqlSugar 系列
【查询返回结果类型】.NET开源ORM框架 SqlSugar 系列
【insert 插入数据语法合集】.NET开源ORM框架 SqlSugar 系列
【SqlSugar雪花ID常见问题】.NET开源ORM框架 SqlSugar 系列
【update 更新数据语法合集】.NET开源ORM框架 SqlSugar 系列


在这里插入图片描述

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

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

相关文章

5 分钟用满血 DeepSeek R1 搭建个人 AI 知识库(含本地部署)

最近很多朋友都在问&#xff1a;怎么本地部署 DeepSeek 搭建个人知识库。 老实说&#xff0c;如果你不是为了研究技术&#xff0c;或者确实需要保护涉密数据&#xff0c;我真不建议去折腾本地部署。 为什么呢&#xff1f; 目前 Ollama 从 1.5B 到 70B 都只是把 R1 的推理能力…

opc da 服务器数据 转 EtherCAT项目案例

目录 1 案例说明 2 VFBOX网关工作原理 3 应用条件 4 查看OPC DA服务器的相关参数 5 配置网关采集opc da数据 6 启动EtherCAT从站转发采集的数据 7 在服务器上运行仰科OPC DA采集软件 8 案例总结 1 案例说明 在OPC DA服务器上运行OPC DA client软件查看OPC DA服务器的相…

微信小程序地图开发总结-规划路线

在现代移动应用中&#xff0c;地图导航功能已成为必不可少的一部分。通过地图 API&#xff0c;我们可以轻松地在应用中集成位置服务和路径规划功能。本篇文章将带大家一起实现一个简单的路径导航功能&#xff0c;使用腾讯地图 API结合微信小程序&#xff0c;实现从当前位置到目…

【已解决】VSCode:“正在重新激活终端”

背景&#xff1a; 1、切换Python环境的时候有问题&#xff0c;然后一直显示“正在重新激活终端”。 2、此处电脑&#xff1a;MAC 解决方法&#xff1a; 打开命令面板&#xff08;按 CtrlShiftP 或 CmdShiftP&#xff09;。输入并选择 Python: Clear Cache and Reload Window…

Grafana-使用Button修改MySQL数据库

背景 众所周知&#xff0c;Grafana是一个用来展示数据的平台&#xff0c;但是有时候还是会有需求说能不能有一个按钮&#xff0c;点击的时候再对数据库进行修改&#xff0c;从而达到更新数据的效果 经过多方查证&#xff0c;终于实现了一个简单的&#xff0c;点击button执行sq…

Android 系统面试问题

一.android gki和非gki的区别 Android GKI&#xff08;Generic Kernel Image&#xff09;和非GKI内核的主要区别在于内核设计和模块化程度&#xff0c;具体如下&#xff1a; 1. 内核设计 GKI&#xff1a;采用通用内核设计&#xff0c;与设备硬件分离&#xff0c;核心功能统一…

CCFCSP备考第一天

第33次认证第一题——词频统计 时间限制&#xff1a; 1.0 秒 空间限制&#xff1a; 512 MiB 下载题目目录&#xff08;样例文件&#xff09; 题目描述 在学习了文本处理后&#xff0c;小 P 对英语书中的 n 篇文章进行了初步整理。 具体来说&#xff0c;小 P 将所有的英文单…

接口测试Day12-持续集成、git简介和安装、Gitee远程仓库、jenkins集成

持续集成 概念&#xff1a; 团队成员将自己的工作成果&#xff0c;持续集成到一个公共平台的过程。成员可以每天集成一次&#xff0c;也可以一天集成多 次。 相关工具&#xff1a; 本地代码管理&#xff1a;git远程代码管理&#xff1a;gitee(国内)、github(国外)、gitlib(公司…

C# OpenCV机器视觉:智能水果采摘

在一个风景如画的小镇边上&#xff0c;有一座阿强家祖传的果园。每到水果成熟的季节&#xff0c;果园里硕果累累&#xff0c;红彤彤的苹果、黄澄澄的梨子、紫莹莹的葡萄&#xff0c;散发着诱人的香气。然而&#xff0c;这丰收的喜悦却总被一件烦心事笼罩 —— 摘水果。 “哎呀…

腾讯云大数据套件TBDS与阿里云大数据能力产品对比

前言 博主在接触大数据方向研究的时候是在2016年,那时候正是大数据概念非常火热的一个时间段,最著名的Google的3篇论文。Google FS、MapReduce、BigTable,奠定了大数据框架产品的基础。Google文件系统,计算框架和存储框架。往后所有的大数据产品和过程域无一不是在三个模块…

设计高效的测试用例:从需求到验证

在现代软件开发过程中&#xff0c;测试用例的设计一直是质量保证&#xff08;QA&#xff09;环节的核心。有效的测试用例不仅能够帮助发现潜在缺陷&#xff0c;提升软件质量&#xff0c;还能降低后期修复成本&#xff0c;提高开发效率。尽管如此&#xff0c;如何从需求出发&…

荣耀手机Magic3系列、Magic4系列、Magic5系列、Magic6系列、Magic7系列详情对比以及最新二手价格预测

目录 荣耀Magic系列手机详细对比 最新二手价格预测 性价比分析 总结 以下是荣耀Magic系列手机的详细对比以及最新二手价格预测&#xff1a; 荣耀Magic系列手机详细对比 特性荣耀Magic3系列荣耀Magic4系列荣耀Magic5系列荣耀Magic6系列荣耀Magic7系列处理器骁龙888&#x…

JAVA-枚举的使用

目录 一、枚举的意义 二、enum类的使用 1.switch 2.常用方法 2.1 values() 和 ordinal() 2.1.1 Enum基本介绍 2.2 valueOf() 2.3 compareTo() 三、枚举的优点和缺点 四、枚举安全在什么地方 一、枚举的意义 public static final int RED 1; public static final int…

前端实现在PDF上添加标注(1)

前段时间接到一个需求&#xff0c;用户希望网页上预览PDF&#xff0c;同时能在PDF上添加文字&#xff0c;划线&#xff0c;箭头和用矩形框选的标注&#xff0c;另外还需要对已有的标注进行修改&#xff0c;删除。 期初在互联网上一通搜索&#xff0c;对这个需求来讲发现了两个问…

Visual Studio Code中文出现黄色框子的解决办法

Visual Studio Code中文出现黄色框子的解决办法 一、vsCode中文出现黄色框子-如图二、解决办法 一、vsCode中文出现黄色框子-如图 二、解决办法 点击 “文件”点击 “首选项”点击 “设置” 搜索框直接搜索unicode选择“文本编辑器”&#xff0c;往下滑动&#xff0c;找到“Un…

二分算法篇:二分答案法的巧妙应用

二分算法篇&#xff1a;二分答案法的巧妙应用 那么看到二分这两个字想必我们一定非常熟悉&#xff0c;那么在大学期间的c语言的教学中会专门讲解二分查找&#xff0c;那么我们来简单回顾一下二分查找算法&#xff0c;我们知道二分查找是在一个有序的序列中寻找一个数在这个序列…

项目6:基于大数据校园一卡通数据分析和可视化

1、项目简介 本项目是基于大数据的清华校园卡数据分析系统&#xff0c;通过Hadoop&#xff0c;spark等技术处理校园卡交易、卡号和商户信息数据。系统实现消费类别、男女消费差异、学院消费排行和年级对比等分析&#xff0c;并通过Web后端和可视化前端展示结果。项目运行便捷&…

怎么在win10系统批量生成下面目录示例文件?

环境&#xff1a; win10系统 问题描述&#xff1a; 怎么在win10系统批量生成下面目录示例文件&#xff0c;刚好有个开源项目要新建 GitHub地址&#xff1a;https://github.com/latiaoge/AI-Sphere-Butler ai-sphere-butler/ # 项目根目录 ├── docs/ …

Java在大数据处理中的应用:从MapReduce到Spark

Java在大数据处理中的应用&#xff1a;从MapReduce到Spark 大数据时代的到来让数据的存储、处理和分析变得前所未有的重要。随着数据量的剧增&#xff0c;传统的单机计算方式已经无法满足处理需求。为了解决这个问题&#xff0c;许多分布式计算框架应运而生&#xff0c;其中Ma…

Pdf手册阅读(1)--数字签名篇

原文阅读摘要 PDF支持的数字签名&#xff0c; 不仅仅是公私钥签名&#xff0c;还可以是指纹、手写、虹膜等生物识别签名。PDF签名的计算方式&#xff0c;可以基于字节范围进行计算&#xff0c;也可以基于Pdf 对象&#xff08;pdf object&#xff09;进行计算。 PDF文件可能包…