国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

如何在 EF Core 中使用樂觀并發(fā)控制

這篇具有很好參考價(jià)值的文章主要介紹了如何在 EF Core 中使用樂觀并發(fā)控制。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

如何在 EF Core 中使用樂觀并發(fā)控制

什么是樂觀并發(fā)控制?

樂觀并發(fā)控制是一種處理并發(fā)訪問的數(shù)據(jù)的方法,它基于一種樂觀的假設(shè),即認(rèn)為并發(fā)訪問的數(shù)據(jù)沖突的概率很低。在樂觀并發(fā)控制中,系統(tǒng)不會(huì)立即對并發(fā)訪問的數(shù)據(jù)進(jìn)行加鎖,而是在數(shù)據(jù)被修改時(shí),再檢查是否有其他并發(fā)操作已經(jīng)修改了數(shù)據(jù)。如果檢測到?jīng)_突,系統(tǒng) 再采取相應(yīng)的措施來解決沖突。

EF Core 內(nèi)置了使用并發(fā)令牌列實(shí)現(xiàn)的樂觀并發(fā)控制,所謂的并發(fā)令牌列通常就是被并發(fā)操作影響的列。請看本文是如何在 EF Core 中使用樂觀并發(fā)控制的……

使用步驟

  1. 創(chuàng)建一個(gè) Asp.net console 項(xiàng)目,并從 Nuget 引用 EF 相關(guān)的包

    Microsoft.EntityFrameworkCore.SqlServer
    Microsoft.EntityFrameworkCore.Tools

  2. 配置并發(fā)沖突列

    using Microsoft.EntityFrameworkCore;
    using Microsoft.EntityFrameworkCore.Metadata.Builders;
    
    class HouseConfig : IEntityTypeConfiguration<House>
    {
    	public void Configure(EntityTypeBuilder<House> builder)
    	{
    		builder.ToTable("T_Houses");
    		builder.Property(p => p.Name).IsUnicode().IsRequired();
    		// 把 Owner 列配置為并發(fā)令牌
    		builder.Property(p => p.Owner).IsConcurrencyToken();
    	}
    }
    
  3. 在 Program.cs 編寫以下代碼:

    using Microsoft.EntityFrameworkCore;
    
    Console.WriteLine("請輸入您的姓名");
    string name = Console.ReadLine()!;
    using TestDbContext ctx = new TestDbContext();
    
    // 1.獲取數(shù)據(jù)
    var h1 = await ctx.Houses.SingleAsync(h => h.Id == 1);
    if (string.IsNullOrEmpty(h1.Owner))
    {
    	// 2.延遲5秒,方便測試
    	await Task.Delay(5000);
    
    	// 3.更新數(shù)據(jù)
    	h1.Owner = name;
    	try
    	{
    		await ctx.SaveChangesAsync();
    		Console.WriteLine("搶到手了");
    	}
    	catch(DbUpdateConcurrencyException ex)
    	{
    		// 4. 捕捉和處理并發(fā)沖突
    		var entry = ex.Entries.First();
    		var dbValues = await entry.GetDatabaseValuesAsync();
    		string newOwner = dbValues.GetValue<string>(nameof(House.Owner));
    		Console.WriteLine($"并發(fā)沖突,被{newOwner}提前搶走了");
    	}
    }
    // 5.處理數(shù)據(jù)已存在情況
    else
    {
    	if (h1.Owner == name)
    	{
    		Console.WriteLine("這個(gè)房子已經(jīng)是你的了,不用搶");
    	}
    	else
    	{
    		Console.WriteLine($"這個(gè)房子已經(jīng)被{h1.Owner}搶走了");
    	}
    }
    Console.ReadLine();
    
  4. 測試

    1. 清理 T_Houses 表數(shù)據(jù),讓 Owner 列等于 null
    2. 同時(shí)運(yùn)行兩個(gè)控制臺(tái)程序
    3. 在第一個(gè)控制臺(tái)程序輸入 Tom 并運(yùn)行
    4. 在第二個(gè)控制臺(tái)程序輸入 Jim 并運(yùn)行
    5. 第一個(gè)控制臺(tái)返回消息:搶到手了
    6. 第二個(gè)控制臺(tái)則返回消息:并發(fā)沖突,被Tom提前搶走了

擴(kuò)展

  1. 通常可以通過把并發(fā)修改的屬性設(shè)置為并發(fā)令牌的方式啟用樂觀并發(fā)控制。

  2. 有時(shí)候無法確定到底哪個(gè)屬性適合作為并發(fā)令牌,比如程序在不同的情況下會(huì)更新不同的列或者程序會(huì)更新多個(gè)列,在這種情況下,可以使用設(shè)置一個(gè)額外的并發(fā)令牌屬性的方式來使用樂觀并發(fā)控制。

  3. 如果使用Microsoft SQL Server數(shù)據(jù)庫,可以用一個(gè)byte[]類型的屬性作為并發(fā)令牌屬性,然后使用IsRowVersion把這個(gè)屬性設(shè)置為RowVersion類型,這個(gè)屬性對應(yīng)的數(shù)據(jù)庫列就會(huì)被設(shè)置為ROWVERSION類型。對于ROWVERSION類型的列,在每次插入或更新行時(shí),Microsoft SQL Server會(huì)自動(dòng)為這一行的ROWVERSION類型的列生成新值。

    1. 增加一個(gè)額外的byte[]類型的屬性
    class House
    {
       public long Id { get; set; }
       public string Name { get; set; }
       public string? Owner { get; set; }
       public byte[] RowVer { get; set; }
    }
    
    2. 配置并發(fā)令牌
    builder.ToTable("T_Houses");
    builder.Property(h => h.Name).IsUnicode();
    builder.Property(h => h.RowVer).IsRowVersion();
    
    3. Update 語句中的 Where 中使用 RowVer 列
    
  4. 其它數(shù)據(jù)庫也可以使用 Guid 作為并發(fā)令牌控制

  5. 樂觀并發(fā)控制能夠避免悲觀鎖帶來的性能下降、死鎖等問題,推薦使用樂觀并發(fā)控制而不是悲觀鎖文章來源地址http://www.zghlxwxcb.cn/news/detail-762346.html

到了這里,關(guān)于如何在 EF Core 中使用樂觀并發(fā)控制的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • EF Core 在實(shí)際開發(fā)中,如何分層?

    EF Core 在實(shí)際開發(fā)中,如何分層?

    分層就是將 EF Core 放在單獨(dú)的項(xiàng)目中,其它項(xiàng)目如 Asp.net core webapi 項(xiàng)目引用它 這樣的好處是解耦和項(xiàng)目職責(zé)的清晰劃分,并且可以重用 EF Core 項(xiàng)目 但是也會(huì)數(shù)據(jù)庫遷移變得復(fù)雜起來 創(chuàng)建一個(gè) .NET 類庫項(xiàng)目,項(xiàng)目名字為 BooksEFCore 引用以下 Nuget 包 Microsoft.EntityFrameworkCore.Relati

    2024年01月24日
    瀏覽(25)
  • 【數(shù)據(jù)庫】基于時(shí)間戳的并發(fā)訪問控制,樂觀模式,時(shí)間戳替代形式及存在的問題,與封鎖模式的對比

    【數(shù)據(jù)庫】基于時(shí)間戳的并發(fā)訪問控制,樂觀模式,時(shí)間戳替代形式及存在的問題,與封鎖模式的對比

    ? 專欄內(nèi)容 : 手寫數(shù)據(jù)庫toadb 本專欄主要介紹如何從零開發(fā),開發(fā)的步驟,以及開發(fā)過程中的涉及的原理,遇到的問題等,讓大家能跟上并且可以一起開發(fā),讓每個(gè)需要的人成為參與者。 本專欄會(huì)定期更新,對應(yīng)的代碼也會(huì)定期更新,每個(gè)階段的代碼會(huì)打上tag,方便階段學(xué)

    2024年02月03日
    瀏覽(20)
  • 使用EF Core創(chuàng)建webapi接口(二)

    使用EF Core創(chuàng)建webapi接口(二)

    有錯(cuò)誤歡迎大家給我指正 說明:netcore webapi+net6+EF?Core版本,codefirst模式(代碼創(chuàng)建數(shù)據(jù)庫) 1.netcore webapi+net6+EF?Core版本,dbfirst模式(代碼生成數(shù)據(jù)庫)見:使用EF Core創(chuàng)建webapi接口(一)-CSDN博客 2.netcore webapi+net6+EF?Core+vue前后端聯(lián)動(dòng)版本,見netcore webapi+net6+EF Core+vue3前后端聯(lián)動(dòng)-CSD

    2024年02月21日
    瀏覽(25)
  • Net Core中使用EF Core連接Mysql數(shù)據(jù)庫

    Net Core中使用EF Core連接Mysql數(shù)據(jù)庫

    Entity Framework Core的前身是微軟提供并主推的ORM框架,簡稱EF,其底層是對ADO.NET的封裝。EF支持SQLServer、MYSQL、Oracle、Sqlite等所有主流數(shù)據(jù)庫。 首先是使用時(shí)的幾個(gè)模式的整理及其理解: Code First:根據(jù)代碼自動(dòng)創(chuàng)建數(shù)據(jù)庫表結(jié)構(gòu)甚至是數(shù)據(jù)庫,可以支持多庫開發(fā),代碼較少冗余

    2024年01月24日
    瀏覽(28)
  • ASP.NET Core Web API入門之三:使用EF Core

    ASP.NET Core Web API入門之三:使用EF Core

    一般來講我們做項(xiàng)目都會(huì)用實(shí)體類跟數(shù)據(jù)庫實(shí)體進(jìn)行關(guān)系對應(yīng),這樣的好處方便我們維護(hù)、增刪改查,并且可以減少SQL的編寫,從而統(tǒng)一風(fēng)格,那么 Entity Framework Core 就是很不錯(cuò)的ORM框架。 1、跨數(shù)據(jù)庫支持能力強(qiáng)大,只需修改配置就可以輕松實(shí)現(xiàn)數(shù)據(jù)庫切換。 2、提升了開發(fā)效

    2024年02月10日
    瀏覽(22)
  • .NET使用一行命令輕松生成EF Core項(xiàng)目框架

    dotnet ef是Entity Framework Core(EF Core)的一個(gè)命令行工具,用于管理EF Core應(yīng)用程序的數(shù)據(jù)庫和代碼。除了提供管理數(shù)據(jù)庫的命令之外,dotnet ef還可以生成和管理實(shí)體和上下文代碼。本文將介紹如何使用dotnet ef動(dòng)態(tài)生成代碼。 一、環(huán)境準(zhǔn)備 1、項(xiàng)目準(zhǔn)備 用vs2022新建一個(gè).NET6的asp.

    2023年04月27日
    瀏覽(32)
  • EF.Core 使用Linq的Contact聯(lián)合查詢問題

    在.net Core 5 WebAPI 項(xiàng)目中應(yīng)用 EF Core 5 實(shí)體框架,使用Linq的Contact聯(lián)合進(jìn)行多表查詢。 定義兩個(gè)子查詢語句,查詢結(jié)果 select 返回的對象結(jié)構(gòu)類型都是一致的。 Linq查詢結(jié)果集封裝對象類: DatingComplaint 實(shí)體類映射(Fluent API): 但在執(zhí)行到 ToListAsync() 代碼行查詢返回結(jié)果時(shí),拋

    2024年02月13日
    瀏覽(17)
  • NET8 ORM 使用AOT SqlSugar 和  EF Core

    NET8 ORM 使用AOT SqlSugar 和 EF Core

    .Net8的本地預(yù)編機(jī)器碼NET AOT,它幾乎進(jìn)行了100%的自舉。微軟為了擺脫C++的鉗制,做了很多努力。也就是代碼幾乎是用C#重寫,包括了虛擬機(jī),GC,內(nèi)存模型等等。而需要C++做的,也就僅僅是引導(dǎo)程序,本篇通過代碼來看下這段至關(guān)重要的引導(dǎo)程序的運(yùn)作模式。 ? ? ?SqlSugar已經(jīng)

    2024年02月05日
    瀏覽(59)
  • 【解惑】當(dāng)處理同一個(gè)字段的并發(fā)問題時(shí),使用樂觀鎖來處理庫存數(shù)量

    以下是一個(gè)使用樂觀鎖處理庫存數(shù)量并發(fā)問題的c#示例代碼: 上述示例代碼使用樂觀鎖來處理并發(fā)問題,確保庫存數(shù)量在更新過程中不受影響。通過使用數(shù)據(jù)庫事務(wù)來保證更新的原子性,并且在更新數(shù)據(jù)之前檢查版本號(hào)是否一致,以避免潛在的并發(fā)沖突。 樂觀鎖是一種樂觀的

    2024年02月13日
    瀏覽(98)
  • .net core 創(chuàng)建WebAPI以及使用EF DBFirst框架使用方法與疑問解答(.net 6)

    EF語法包: 生成實(shí)體模型: 修改實(shí)體模型: 把生成的實(shí)體和上下文都輸出到某個(gè)文件夾命令 增加JSON格式腳手架: 若想增加某個(gè)版本json腳手架,需要加入后綴如: 問題與解決方案: 1、問題: Your startup project \\\'XXX\\\' doesn\\\'t reference Microsoft.EntityFrameworkCore.Design. This package is requi

    2024年02月16日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包