chatGPT幫助開發實戰解答問題和反思

来源:https://www.cnblogs.com/ncellit/archive/2023/02/23/17147559.html
-Advertisement-
Play Games

問題來自.Net開發群友 問題 我想做一個自動生成單據號的功能,但是在EFCORE里沒有行級鎖,請有什麼等價方案嗎? ChatGPT回答 在 EF Core 中確實沒有提供行級鎖(row-level locking)的功能,因為這需要對資料庫進行顯式的鎖定操作,而 EF Core 的設計理念是儘可能 ...


 

問題來自.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軟體去替代,而是為了原本的最終目的提供多一種方式,而程式員則是這多出來的一種方式的設計師,讓這個新的方式更加的容易被大眾接納和方便使用

要不然,我原本方式很簡單,為什麼要用你給我提供的方式呢?近些年開發行業也經常出現這種本末倒置的情況,很多碼農都不知道自己開發這些軟體應用的目的到底是為什麼,對於我們開發者而言

不管什麼技術,只是為了達成最終目的的手段,而不是最終目的

 

這也是我實在不喜歡背誦一些照本宣科的書面理論知識,而是更熱衷提出和發現程式的到設計思路

說了這麼多只是想說,程式員的未來肯定會是架構師,我們所有的技術積累我個人看來只是為了讓我們的思維從普通人轉換成程式員思維,而且我相信在未來,編程思維會如同吃飯一樣,成為每個人的必備

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 睏倦的時候寫了個個獲取本地時間,列印總比當前時間大8小時,找了很久原因 package main import ( "fmt" "time" ) func main() { now := time.Now() fmt.Println(now) fmt.Println("nowStr:", now.F ...
  • pandas條件替換值(where&mask) 在日常分析中,經常會遇到對數據的篩選處理相關的工作,我們可以使用loc和iloc定位分析篩選的列或行數據,下麵介紹一種高級篩選的用法where和mask。 pd.where: 替換條件(condition)為Flase處的值 pd.mask: 替換條件 ...
  • 這篇文章主要描述分散式系統中經常討論的CAP理論,它從一致性、可用性和分區容錯性是分散式系統的三個特征,我們只能滿足其中兩個特征,對於分散式系統來說,根據不同的應用場景,可以是AP,也可以是CP。 ...
  • Java ”框架 = 註解 + 反射 + 設計模式“ 之 反射詳解 每博一文案 無論幸福還是苦難,無論光榮還是屈辱,你都要自己遭遇與承受。 —————— 《平凡的世界》 孫少平 多少美好的東西消失和毀滅了,世界還像什麼事也沒有發生,是的,生活在繼續著。 可是,生活中的每一個卻在不斷地失去自己最珍貴的 ...
  • RestSharp RestSharp是一個輕量的,不依賴任何第三方的模擬Http的組件或者類庫。RestSharp具體以下特性;支持net4.0++,支持HTTP的GET, POST, PUT, HEAD, OPTIONS, DELETE等操作,支持oAuth 1, oAuth 2, Basic, ...
  • 在使用應用程式的過程中,經常要求應用程式只能運行一次。如果發現重覆開啟,應從系統進程列表中搜索到已經開啟的進程,並將該進程視窗移到最前端顯示。 記錄一下過程。 實現過程 在 Program.cs 文件的 Program 類中聲明兩個外部調用函數 [DllImport("User32")] priva ...
  • 概述 裝飾器模式 允許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬於結構型模式,它是作為現有的類的一個包裝。這種模式創建了一個裝飾類,用來包裝原有的類,併在保持類方法簽名完整性的前提下,提供了額外的功能。 簡單理解就是動態的給一個對象添加一些額外的職責,就增加功能來說,裝飾 ...
  • 最近新接觸了GeoServer,從零開始的研究也是折磨了好幾天,發現GeoServer這塊很多大佬分享各種解決方案,也是幫了我大忙,剛好告一個段落了,所以也貢獻一下我這幾天的研究成果,希望能幫到大家。 目標:使用GeoServer自動化發佈NetCDF文件,實現部署在Linux上自動化更新圖層 環境 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...