日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

EFCore 5 新特性 Savepoints

發布時間:2023/12/4 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 EFCore 5 新特性 Savepoints 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

EFCore 5 中的 Savepoints

Intro

EFCore 5中引入了一個新特性,叫做 Savepoints,主要是事務中使用,個人感覺有點類似于 Windows 上的系統還原點,如果事務發生了異常,可以回滾到某一個還原點。

Savepoints

當我們在一個事務里執行 SaveChanges 的時候,EF Core 會在保存數據之前自動的創建一個 savepoint,Savepoints 有點類似于系統還原點的概念,我們可以回滾到指定的 savepoint,

當事務發生錯誤的時候,會自動回滾到事務創建的 savepoint 回滾到事務開始之前的狀態,以便于我們做重試或可能的修復錯誤或其他邏輯。

我們可以通過 CreateSavepoint 來手動創建一個 savepoint,使用 RollbackToSavepoint 來回滾到某一個 savepoint

來看一個微軟的示例代碼吧:

using?var?context?=?new?BloggingContext(); using?var?transaction?=?context.Database.BeginTransaction();try {context.Blogs.Add(new?Blog?{?Url?=?"https://devblogs.microsoft.com/dotnet/"?});context.SaveChanges();transaction.CreateSavepoint("BeforeMoreBlogs");context.Blogs.Add(new?Blog?{?Url?=?"https://devblogs.microsoft.com/visualstudio/"?});context.Blogs.Add(new?Blog?{?Url?=?"https://devblogs.microsoft.com/aspnet/"?});context.SaveChanges();transaction.Commit(); } catch?(Exception) {//?If?a?failure?occurred,?we?rollback?to?the?savepoint?and?can?continue?the?transactiontransaction.RollbackToSavepoint("BeforeMoreBlogs");//?TODO:?Handle?failure,?possibly?retry?inserting?blogs }

Sample

我們自己來動手一試,示例代碼如下:

var?services?=?new?ServiceCollection(); services.AddDbContext<TestDbContext>(options?=> {options.UseSqlite("Data?Source=Application.db;Cache=Shared").LogTo(Console.WriteLine,?LogLevel.Warning); }); using?var?provider?=?services.BuildServiceProvider(); using?var?scope?=?provider.CreateScope(); var?dbContext?=?scope.ServiceProvider.GetRequiredService<TestDbContext>(); dbContext.Database.EnsureCreated(); Console.WriteLine($"Posts?count:{dbContext.Posts.Count()}"); using?var?transaction?=?dbContext.Database.BeginTransaction(); try {dbContext.Posts.Add(new?Post()?{?Author?=?"Tom",?Title?=?"Date?changed",?PostedAt?=?DateTime.UtcNow,?});dbContext.Posts.Add(new?Post()?{?Author?=?"Tom",?Title?=?"Date?changed",?PostedAt?=?DateTime.UtcNow,?});dbContext.SaveChanges();transaction.CreateSavepoint("Stage1");Console.WriteLine($"Posts?count:{dbContext.Posts.Count()}");dbContext.Posts.Add(new?Post()?{?Author?=?"Alice",?Title?=?"Test",?PostedAt?=?DateTime.UtcNow,?});dbContext.SaveChanges();transaction.CreateSavepoint("Stage2");Console.WriteLine($"Posts?count:{dbContext.Posts.Count()}");throw?new?InvalidOperationException();transaction.Commit(); } catch?(Exception) {Console.WriteLine("Exception?throw");transaction.RollbackToSavepoint("Stage1"); }Console.WriteLine($"Posts?count:{dbContext.Posts.Count()}");

示例代碼中創建了兩個 savepoint,然后拋出了一個異常,捕獲異常后回滾到第一個 savepoint

輸出結果如下:

output

可以看到,只有第一個 savepoint 之前的數據保存了下來,第二個 savepoint 雖然數據成功保存了,但是又被回滾了,最終只有第一個 savepoint 之前的數據變更被保存了下來

More

通過 savepoint 我們就可以使得事務控制更加精細,可以更能夠好的控制事務中的數據變更

但是需要注意的是,這個功能不要和 Sql Server 中的 Multiple Active Result Sets 一起使用,一旦發生了錯誤,事務控制可能會發生不可預期的情況。

Savepoints are incompatible with SQL Server's Multiple Active Result Sets, and are not used. If an error occurs during SaveChanges, the transaction may be left in an unknown state.

References

  • https://docs.microsoft.com/en-us/ef/core/saving/transactions#savepoints

  • https://github.com/WeihanLi/SamplesInPractice/blob/master/EF5Samples/SavePointsTest.cs

總結

以上是生活随笔為你收集整理的EFCore 5 新特性 Savepoints的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。