已實現樂觀鎖功能,FreeSql.DbContext 准備起航


上回說到 FreeSql.DbContext 的規則,以及演示它的執行過程,可惜當時還不支持“樂觀鎖”,對於更新數據來講並不安全。

FreeSql 核心庫 v0.3.27 已提供樂觀鎖支持。

實現原理

樂觀鎖的原理,是利用實體某字段,如:long version,更新前先查詢數據,此時 version 為 1,更新時產生的 SQL 會附加 where version = 1,當修改失敗時(即 Affrows == 0)拋出異常。

每個實體只支持一個樂觀鎖,在屬性前標記特性:[Column(IsVersion = true)] 即可。

無論是使用 FreeSql/FreeSql.Repository/FreeSql.DbContext,每次更新 version 的值都會增加 1

至此,FreeSql.DbContext 的更新操作就安全了。

安裝

dotnet add package FreeSql.DbContext

測試功能

下面演示更新 BigNumber 屬性,為什么定義他為 string 呢,對於數字的更新 set clicks = clicks + 1,是安全的操作。

BigInteger 了解嗎,我們就當 BigNumber 是一個超大的數字吧,普通數字無法表示的。

var fsql = new FreeSql.FreeSqlBuilder()
    .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|\document.db;Pooling=true;Max Pool Size=10")
    .UseAutoSyncStructure(true)
    .UseLazyLoading(true)
    .UseNoneCommandParameter(true)

    .UseMonitorCommand(cmd => Trace.WriteLine(cmd.CommandText))
    .Build();

public class Song {
    [Column(IsIdentity = true)]
    public int Id { get; set; }
    public string BigNumber { get; set; }

    [Column(IsVersion = true)]//使用簡單
    public long versionRow { get; set; }
}

public class SongContext : DbContext {

    public DbSet<Song> Songs { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder builder) {
        builder.UseFreeSql(fsql);
    }
}

當更新時,版本不正確提示以下錯誤,DbContext 將回滾操作:

總結

FreeSql.DbContext 實現類似 EFCore 使用方法,跟蹤對象狀態,最終通過 SaveChanges 方法提交事務。

目前是第二個初版,已實現狀態跟蹤保存(導航屬性的跟蹤暫時不支持)。

配合樂觀鎖這個殺手鐧,FreeSql 越來越有 ORM 的影子了。

github: https://github.com/2881099/FreeSql(求星星,謝謝)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM