已实现乐观锁功能,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 (求星星,谢谢)

本文分享自微信公众号 - DotNet程序园(dotnetblog)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端实习日记

QA

1.链接:https://yzbaoo.github.io/resume/ 项目地址:https://github.com/yzbaoo/resume 2.链接...

8520
来自专栏守候书阁

[无心插柳]简单实现常用的表单校验函数

表单校验,相信绝大部分的开发者会遇到过,网上也有很多插件可使用。但当时想着就是简单的校验,没必要引插件,就自己写一个简单的函数。随着校验的需求多样化,函数越来越...

16030
来自专栏林德熙的博客

win10 uwp 使用 AppCenter 自动构建

微软在今年7月上线 appcenter.ms 这个网站,通过 App Center 可以自动对数千种设备进行适配测试、快速将应用发送给测试者或者直接发布到应用商...

7810
来自专栏林德熙的博客

git 分支改名

例如当前的分支是 master 分支,想要修改 t/lindexi 分支为 t/lindexiIsDoubi

35630
来自专栏smy

Git中.gitignore文件不起作用的解决以及Git中的忽略规则介绍

在Studio里使用Git管理代码的过程中,可以修改.gitignore文件中的标示的方法来忽略开发者想忽略掉的文件或目录,如果没有.gitignore文件,可...

9720
来自专栏林德熙的博客

win10 uwp 使用 Azure DevOps 自动构建

通过 Azure DevOps 可以做到自动构建程序,覆盖计划、创建、编程、测试、部署、发布、托管、共享等各个环节,适用于大多数的语言、平台。 本文继续使用图床...

9030
来自专栏颇忒脱的技术博客

创建Jenkins Pipeline流水账

点击创建流水线后Jenkins会拉取GIT仓库,并且尝试寻找存在Jenkinsfile的分支,然后构建。不过不管构建是否成功,都不要管它,我们回到经典页面做进一...

15120
来自专栏林德熙的博客

win10 uwp 使用 msbuild 命令行编译 UWP 程序

在有一些时候,如使用持续集成的时候就不能通过 VisualStudio 的方式编译 UWP 程序,需要使用命令行的方式编译。

12920
来自专栏林德熙的博客

Sublime Text 好用的插件 Git Gutter从资源管理器打开当前的文件

jisaacks/GitGutter: A Sublime Text 2/3 plugin to see git diff in gutter

15230
来自专栏Web技术布道师

one 1.4.1 发布,基于 Swoole 的极简常驻内存框架

10620

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励