EFCore 悲观锁 和 乐观锁
2022/8/27 6:23:09
本文主要是介绍EFCore 悲观锁 和 乐观锁,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
乐观并发控制
并发令牌Owner
经典例子就是两个人同时执行了抢购业务 Update是同时执行的,这就导致后面的会覆盖前面的,导致业务出现问题!
原理就是在 update的表中 Owner = 旧值
1、我们需要 只需要让EFCore在 code first下配置实体 设置一下Owner 字段为 IsConcurrencyToken() 设置为并发令牌
2、例如:“builder.Property(x=>x.Owner).IsConcurrencyToken()”
3、在保存的时候进行 SaveChangesAsync() 添加
catch(DbUpdateConcurrencyException ex) 进行捕获
例如:
try{ await ctx.SaveChangesAsync(); Console.WriteLine("抢到手了"); } catch (DbUpdateConcurrencyException ex) { var entry = ex.Entries.First(); var dbValues = await entry.GetDatabaseValuesAsync(); string newOwner = dbValues.GetValue<string>(nameof(House.Owner)); Console.WriteLine($"并发冲突,被{newOwner}提前抢走了"); }
效果图
测试
生成的SQL
可以看到 我们定义的并发令牌字段 IsConcurrencyToken 会在 Update And 带上这个字段 进行查询
可能比较抽象 这里我们可以用具体的sql 语句进行分析
例如:
第一次执行的 Update T_houses Set Owner= 'tom' where Id =1 And Owner = '' 注意:此时Owner 是没有值的 所以受影响行数为 1
第二次执行的 Update T_houses Set Owner= 'tom' where Id =1 And Owner = ''
注意:此时Owner 第一次执行后Owner已经被赋值了,所以此时 where Id =1 的Owner是值的,所以where条件是不满足 受影响行数为 0
这篇关于EFCore 悲观锁 和 乐观锁的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享