问题来自.Net开发群友

问题

我想做一个自动生成单据号的功能,但是在EFCORE里没有行级锁,请有什么等价方案吗?

ChatGPT回答

在 EF Core 中确实没有提供行级锁(row-level locking)的功能,因为这需要对数据库进行显式的锁定操作,而 EF Core 的设计理念是尽可能不与数据库直接交互,而是通过抽象层面的数据操作来实现,因此不鼓励使用显式的锁定操作。

不过,在 EF Core 中提供了乐观并发控制(Optimistic Concurrency Control)的功能,可以用于处理类似于行级锁的需求。乐观并发控制基于版本号(Version)机制实现,每个实体对象都有一个版本号属性,当两个用户同时更新同一个实体对象时,EF Core 会比较它们的版本号,如果版本号不一致,则表示有冲突发生,需要执行相应的冲突解决逻辑。

因此,如果你想实现自动生成单据号的功能,并保证其唯一性,可以考虑使用乐观并发控制的方案。具体的实现思路如下:

  1. 在你的实体对象中增加一个版本号属性,类型为整数。

  2. 在生成单据号前,使用 EF Core 查询最后一条记录的单据号和版本号,得到最新的单据号和版本号。

  3. 在生成单据号时,将版本号加 1,并将单据号和版本号写入到新的记录中。如果写入数据库时发生冲突,则表示有其他用户同时在生成单据号,此时可以重新获取最新的单据号和版本号,并再次尝试生成。

以下是一个简单的示例代码,演示了如何使用乐观并发控制来生成唯一的单据号

public class Order
{
public int Id { get; set; }
public string OrderNo { get; set; }
public int Version { get; set; }
} public class OrderContext : DbContext
{
public DbSet<Order> Orders { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Order>()
.Property(o => o.Version)
.IsConcurrencyToken();
}
} public class OrderService
{
private readonly OrderContext _context; public OrderService(OrderContext context)
{
_context = context;
} public string GenerateOrderNo()
{
string lastOrderNo = _context.Orders
.OrderByDescending(o => o.Id)
.Select(o => o.OrderNo)
.FirstOrDefault(); int lastVersion = _context.Orders
.OrderByDescending(o => o.Id)
.Select(o => o.Version)
.FirstOrDefault(); string newOrderNo = GenerateNewOrderNo(lastOrderNo); var order = new Order
{
OrderNo = newOrderNo,
Version = lastVersion + 1
}; _context.Orders.Add(order); try
{
_context.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
// 处理并发冲突
ex.Entries.Single().Reload();
lastOrderNo = _context.Orders
.OrderByDescending(o => o.Id)
.Select(o=> o.OrderNo) .FirstOrDefault(); lastVersion = _context.Orders .OrderByDescending(o => o.Id) .Select(o => o.Version) .FirstOrDefault(); newOrderNo = GenerateNewOrderNo(lastOrderNo); order.OrderNo = newOrderNo; order.Version = lastVersion + 1; _context.SaveChanges(); } return newOrderNo; } private string GenerateNewOrderNo(string lastOrderNo) { // 生成新的单据号逻辑 // ... }
}

反思

EFCORE 和 行级锁,如果提问者不知道这两者的含义根本没法问,就算问了,回答的东西,所以chatGPT对提问者也是有要求的

再没有chatGPT以前,我们码农如果遇到这个问题如何解决了?

很简单,使用各种搜索引擎,或者询问同行,搜集零碎的信息然后最终拼凑起来

程序员在有了chatGPT之后,有什么变化?

显而易见,缩短了搜索的时间

总结

其实不管是以前的面向搜索引擎编程,还是面向群友编程,其实都在暗中隐喻了程序员的未来——架构师

开发软件应用,最终是为了人类某个行业提供多一种可选方式

(例如外卖,古代也有外卖,让店小二提餐走路送去大户人家家里

  后来有了马车,单车,直到现在的摩托车,什么变了?方式变了,最终目的并没有改变

做开发其实也是一个道理,我们并不是做一个XX软件去替代,而是为了原本的最终目的提供多一种方式,而程序员则是这多出来的一种方式的设计师,让这个新的方式更加的容易被大众接纳和方便使用

要不然,我原本方式很简单,为什么要用你给我提供的方式呢?近些年开发行业也经常出现这种本末倒置的情况,很多码农都不知道自己开发这些软件应用的目的到底是为什么,对于我们开发者而言

不管什么技术,只是为了达成最终目的的手段,而不是最终目的

这也是我实在不喜欢背诵一些照本宣科的书面理论知识,而是更热衷提出和发现程序的到设计思路

说了这么多只是想说,程序员的未来肯定会是架构师,我们所有的技术积累我个人看来只是为了让我们的思维从普通人转换成程序员思维,而且我相信在未来,编程思维会如同吃饭一样,成为每个人的必备

chatGPT帮助开发实战解答问题和反思的更多相关文章

  1. [原创].NET 业务框架开发实战之十 第一阶段总结,深入浅出,水到渠成(后篇)

    原文:[原创].NET 业务框架开发实战之十 第一阶段总结,深入浅出,水到渠成(后篇) .NET 业务框架开发实战之十 第一阶段总结,深入浅出,水到渠成(后篇) 前言:接着上篇来. 系列文章链接: [ ...

  2. 《精通Spring 4.X企业应用开发实战》读书笔记1-1(IoC容器和Bean)

    很长一段时间关注在Java Web开发的方向上,提及到Jave Web开发就绕不开Spring全家桶系列,使用面向百度,谷歌的编程方法能够完成大部分的工作.但是这种不系统的了解总觉得自己的知识有所欠缺 ...

  3. chrome拓展开发实战:页面脚本的拦截注入

    原文请访问个人博客:chrome拓展开发实战:页面脚本的拦截注入 目前公司产品的无线站点已经实现了业务平台组件化,所有业务组件的转场都是通过路由来完成,而各个模块是通过requirejs进行统一管理, ...

  4. 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING

    <Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th  2014 Email:skyseraph00@163.com 更多精彩请直接 ...

  5. CSS高效开发实战:CSS 3、LESS、SASS、Bootstrap、Foundation --读书笔记(1)设定背景图

    技术的新发展,除计算机可以接入互联网之外,平板电脑.智能手机.智能电视等其他设备均可访问互联网.在多设备时代,构建多屏体验也不是听说的那么难. 但是这也增加了学习CSS的难度?不知道如何上手,只懂一点 ...

  6. 《Node.js开发实战详解》学习笔记

    <Node.js开发实战详解>学习笔记 ——持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...

  7. 第九篇 :微信公众平台开发实战Java版之如何实现自定义分享内容

    第一部分:微信JS-SDK介绍 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统 ...

  8. 第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息

    第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...

  9. 第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息

    在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据O ...

  10. 第六篇 :微信公众平台开发实战Java版之如何自定义微信公众号菜单

    我们来了解一下 自定义菜单创建接口: http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_to ...

随机推荐

  1. 轻松玩转awk

    awk的处理方式 awk一次处理一行内容 awk对每行可以进行切片处理 例如 awk -F ':' '{print $1}' /etc/password -F指定每一行分割符号,这样就把被每行被:分割 ...

  2. 07#Web 实战:实现 GitHub 个人主页项目拖拽排序

    实现效果图 GitHub 和 Gitee 个人主页中可以对自己的项目进行拖拽排序,于是我就想自己实现一个.本随笔只是记录一下大概的实现思路,如果感兴趣的小伙伴可以通过代码和本随笔的说明去理解实现过程. ...

  3. SpringMVC03:SSM整合

    一.搭建整合环境 1.ssm整合说明 2.搭建环境 二.Spring框架代码的编写 1.编写Spring框架(处理业务层) applicationContext.xml <?xml versio ...

  4. 【Hadoop学习】下:MapReduce程序编写、Hadoop序列化、框架原理、Yarn组件、设置队列

    一.MapReduce概述 1.定义 编程框架,组成分布式运算程序,运行在集群上 2.特点 优点:易于编程.扩展性.容错性(内部完成).海量数据离线处理 缺点:非实时.不擅长流式计算.不擅长DAG有向 ...

  5. python中的数学函数

  6. ARL灯塔系统搭建

    前言 ARL(Asset Reconnaissance Lighthouse)资产侦查灯塔,是一个良好的资产收集系统,旨在为渗透测试人员以及安全团队基于企业的网络安全能快速查找到指定企业资产中的脆弱点 ...

  7. [python] 圆形嵌套图Circular Packing

    圆形嵌套图Circular Packing 文章目录 圆形嵌套图Circular Packing 1 具有一级层次的圆形嵌套图绘制 1.1 绘图数据与circlify计算 1.2 图形绘制 1.2.1 ...

  8. CLISP学习(二)

    它是一门函数式语言,你要用函数的思维来思考. 只不过与数学的表达不同的是,数学里的函数是在括号外  f(x) ,而lisp是在括号内,以列表的形式(f x), cos(x) --> (cos x ...

  9. 琐碎的想法(五)for 的前世今生

    for 起因 记得大学上C语言的课,第一次遇到的问题就是循环结构里面的 for. 选择结构的 if 非常易懂,和日常生活的判断没有区别. 循环结构的 while 同样比较好理解. 本质上是一个判断 如 ...

  10. [C#]关于逆变与协变的基本概念和修饰符in与out的意义

    协变与逆变的概念 假如两个类型X和Y具有特殊关系,X类型的每个值都能转换成Y类型.我们将I<X>向I<Y>的转换称为协变转换.反之我们将I<Y>向I<X> ...