已实现乐观锁功能,FreeSql.DbContext 准备起航
2019-03-29 22:37
27 查看
上回说到 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(求星星,谢谢)
相关文章推荐
- VC起航--实现画线功能
- SharePoint 2010实现文档管理功能(一)准备
- Android实现短信验证功能(使用前的准备)
- 这两天准备实现RSS导入功能
- 2014.02.14 实现修改功能的一点准备工作
- APUE习题[实现dup2函数功能,不使用fcntl]
- Android学习之 换肤功能模块的实现<三>
- javascript实现网站加入收藏功能
- 用DirectShow实现QQ的音视频聊天功能
- 利用SAE cron功能实现上海二手房数据的自动收集
- 应用ORACLE 10G以上细粒度审计功能实现操作审计
- 在Python的Django框架中实现Hacker News的一些功能
- IOS项目集成ShareSDK实现第三方登录、分享、关注等功能(备用)
- SSH之实现支付功能
- Select下拉框模糊查询功能实现代码
- Android中使用AsyncTask实现下载文件动态更新进度条功能
- jquery实例以及常用jQuery主要功能实现
- 消除小程序 button 基本样式和实现扩展功能
- 微信小程序实现评论功能
- ASP 程序实现自动升级功能