已实现乐观锁功能,FreeSql.DbContext 准备起航

上回说到 FreeSql.DbContext 的规则,以及演示它的执行过程,惋惜当时还不支持“乐观锁”,对于更新数据来说并不安全。git

FreeSql 核心库 v0.3.27 已提供乐观锁支持。github

实现原理

乐观锁的原理,是利用实体某字段,如:long version,更新前先查询数据,此时 version 为 1,更新时产生的 SQL 会附加 where version = 1,当修改失败时(即 Affrows == 0)抛出异常。sql

每一个实体只支持一个乐观锁,在属性前标记特性:[Column(IsVersion = true)] 便可。安全

不管是使用 FreeSql/FreeSql.Repository/FreeSql.DbContext,每次更新 version 的值都会增长 1

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

安装

dotnet add package FreeSql.DbContext

测试功能

下面演示更新 BigNumber 属性,为何定义他为 string 呢,对于数字的更新 set clicks = clicks + 1,是安全的操做。测试

BigInteger 了解吗,咱们就当 BigNumber 是一个超大的数字吧,普通数字没法表示的。ui

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 将回滚操做:spa

总结

FreeSql.DbContext 实现相似 EFCore 使用方法,跟踪对象状态,最终经过 SaveChanges 方法提交事务。code

目前是第二个第一版,已实现状态跟踪保存(导航属性的跟踪暂时不支持)。对象

配合乐观锁这个杀手锏,FreeSql 愈来愈有 ORM 的影子了。

github: https://github.com/2881099/Fr... (求星星,谢谢)

相关文章
相关标签/搜索