The database operation was expected to affect 1 row(s), but actually affected 0 row(s); 解决乐观并发

这篇具有很好参考价值的文章主要介绍了The database operation was expected to affect 1 row(s), but actually affected 0 row(s); 解决乐观并发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

The database operation was expected to affect 1 row(s), but actually affected 0 row(s); 解决乐观并发

1.乐观并发

EF Core 实现 乐观并发,假定并发冲突相对较少。 与 悲观 方法(即先锁定数据,然后才继续修改数据)不同,乐观并发不需要锁定,而是安排数据修改在保存时失败(如果数据自查询后已更改)。 此并发故障将报告给应用程序,应用程序可能会通过对新数据重试整个操作来相应地处理它。

在 EF Core 中,乐观并发是通过将属性配置为 并发令牌来实现的。 在查询实体时加载和跟踪并发令牌,就像任何其他属性一样。 然后,在 期间 SaveChanges()执行更新或删除操作时,数据库上的并发令牌值与 EF Core 读取的原始值进行比较。

代码触发乐观会如下错误:

Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException: The database operation was expected to affect 1 row(s), but actually affected 0 row(s); data may have been modified or deleted since entities were loaded. See http://go.microsoft.com/fwlink/?LinkId=527962 for information on understanding and handling optimistic concurrency exceptions.

2.设置乐观锁

我的程序使用EF Core,然后给实体类设置了乐观并发 UseIdentityColumn

 public void Configure(EntityTypeBuilder<ChatRecord> builder)
 {
 //在 PostgreSQL 中,表名以及列名是不区分大小写的。这意味着在数据库中创建表时,无论您是使用大写、小写或混合大小写的名称,最终都会使用相同的名称来访问和操作该表。
 //设置表
 builder.ToTable("ChatRecord");
 //设置表主键
 builder.HasKey(e => e.ChatRecordId);
 //设置主键自增
 builder.Property(e => e.ChatRecordId)
 .UseIdentityColumn();
}

3.什么情况下会触发乐观并发

乐观并发允许发生并发冲突,并在并发冲突发生时作出正确反应。 例如,Jane 访问院系编辑页面,将英语系的预算从 350,000.00 美元更改为 0.00 美元。

在 Jane 单击“保存”之前,John 访问了相同页面,并将开始日期字段从 2007/1/9 更改为 2013/1/9。

Jane 单击“保存”后看到更改生效,因为浏览器会显示预算金额为零的“索引”页面。

John 单击“编辑”页面上的“保存”,但页面的预算仍显示为 350,000.00 美元。 接下来的情况取决于并发冲突的处理方式:

  • 跟踪用户已修改的属性,并仅更新数据库中相应的列。

    在这种情况下,数据不会丢失。 两个用户更新了不同的属性。 下次有人浏览英语系时,将看到 Jane 和 John 两个人的更改。 这种更新方法可以减少导致数据丢失的冲突数。 这种方法具有一些缺点:

    • 无法避免数据丢失,如果对同一属性进行竞争性更改的话。
    • 通常不适用于 Web 应用。 它需要维持重要状态,以便跟踪所有提取值和新值。 维持大量状态可能影响应用性能。
    • 可能会增加应用复杂性(与实体上的并发检测相比)。
  • 让 John 的更改覆盖 Jane 的更改。

    下次有人浏览英语系时,将看到 2013/9/1 和提取的值 350,000.00 美元。 这种方法称为“客户端优先”或“最后一个优先”方案 。 客户端的所有值优先于数据存储的值。 基架代码不处理并发,“客户端优先”方案会自动执行。

  • 阻止在数据库中更新 John 的更改。 应用通常会:

    • 显示错误消息。
    • 显示数据的当前状态。
    • 允许用户重新应用更改。

    这称为“存储优先”方案。 数据存储值优先于客户端提交的值。 本教程中使用了“存储优先”方案。 此方法可确保用户在未收到警报时不会覆盖任何更改。

4.解决方案:重写SaveChanges

在 FrameworkDbContext 的DbContext类中重写SaveChanges方法

代码如下:

 public override int SaveChanges()
        {
            var saved = 0;
            while (saved ==0) {
                try {
                    base.SaveChanges();
                    saved++;
                }
                catch (DbUpdateConcurrencyException ex) {
                    foreach (var entry in ex.Entries) {
                            var proposedValues = entry.CurrentValues;
                            var databaseValues = entry.GetDatabaseValues();

                            foreach (var property in proposedValues.Properties) {
                                var proposedValue = proposedValues[property];
                                var databaseValue = databaseValues[property];
                            }

                            // Refresh original values to bypass next concurrency check
                            entry.OriginalValues.SetValues(databaseValues);
                    }
                }
            }

            return saved;
        }

代码可以在github中查找。我的开源项目修改的类的源码,源码地址:https://github.com/TerraMours/TerraMours_Gpt_Api/blob/main/TerraMours/TerraMours/Framework/Infrastructure/EFCore/FrameworkDbContext.cs

参考资料:https://learn.microsoft.com/zh-cn/ef/core/saving/concurrency?tabs=fluent-api

阅读如遇样式问题,请前往个人博客浏览: https://www.raokun.top

拥抱ChatGPT:https://first.terramours.site

开源项目地址:https://github.com/TerraMours/TerraMours_Gpt_Api文章来源地址https://www.toymoban.com/news/detail-668825.html

到了这里,关于The database operation was expected to affect 1 row(s), but actually affected 0 row(s); 解决乐观并发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • uniapp报错:request:fail abort statusCode:-1 Expected URL scheme ‘http‘ or ‘https‘ but was ‘file‘

    这个报错的意思是请求失败,因为URL方案不是“http”或“https”,而是“file”。 这个问题通常是由于您在使用uni-app应用程序并尝试从应用程序外部使用“本地文件路径”时发生的。在uni-app框架中,无法使用本地文件路径,因为它不是有效的http或https网址。要避免这个问题,

    2024年02月03日
    浏览(10)
  • The operation was rejected by your operating system. npm ERR! It‘s possible that the file was alrea

    The operation was rejected by your operating system. npm ERR! It‘s possible that the file was alrea

    在win10系统下安装node.js出现了如下的报错。 首先需要在安装node.js文件夹中自行创立这两个文件夹,node_global代表全局变量的文件夹,node_cache代表缓存的文件夹。 接下来要配置文件: 这里换成自己的路径即可。 接下来就是配置环境变量: 然后将用户变量中Path,关于node的环

    2024年02月12日
    浏览(9)
  • VUE中eslint报错: Expected linebreaks to be ‘LF‘ but found ‘CRLF

    VUE中eslint报错: Expected linebreaks to be ‘LF‘ but found ‘CRLF

    出现这个的原因 :windows 环境下, git 在我们 pull 代码的时候,会自动识别当前的系统环境。将原本的(linux/unix)换行改成对应系统的,在我们提交代码的时候又会转成远程系统环境的(Linux/unix),然后又装了 eslint,默认就是使用 LF,所以就会报这个错误 各种环境下换行符格

    2023年04月08日
    浏览(9)
  • npm install安装失败,报错记录之The operation was rejected by your operating system.

    npm install安装失败,报错记录之The operation was rejected by your operating system.

    今天在执行 npm install 的时候一直报如下错误:  npm ERR! code EPERM npm ERR! syscall rename npm ERR! path F:Demo Practise一些小demo练习vue练习vue3vue3-demonode_modules@vuecli-service npm ERR! dest F:Demo Practise一些小demo练习vue练习vue3vue3-demonode_modules@vue.cli-service.DELETE npm ERR! errno -4048 npm ERR! Er

    2024年02月03日
    浏览(7)
  • mixed content the site was loaded over a secure connection but the file at was loaded over an insecu

    mixed content the site was loaded over a secure connection but the file at was loaded over an insecure connection 问题: 在https地址试图通过a标签跳转到http下载地址时,浏览器报错 mixed content the site https://xxx was loaded over a secure connection but the file at http://yyy was loaded over an insecure connection 原因 推测是触发了

    2024年02月14日
    浏览(36)
  • RuntimeError: stack expects each tensor to be equal size, but got at entry

    RuntimeError: stack expects each tensor to be equal size, but got at entry

    参考链接:​​​​​​解决Pytorch dataloader时报错每个tensor维度不一样的问题_python_脚本之家 记录一下自己遇到的bug: 问题描述:  问题分析: torch.stack(batch, 0, out=out)出错,原因可能是: 同一个batch的数据图片的维度(H, W, C)要相同(可以见官方文档:其shape必须一致) 问

    2024年02月15日
    浏览(12)
  • IDEA Kafka:The configuration ‘xxx‘ was supplied but isn‘t a known config

    IDEA Kafka:The configuration ‘xxx‘ was supplied but isn‘t a known config

    报错信息 处理思路: 提供思路 有可能是消费的数据过大,资源不足,建议 重启 Kafka 清空缓存释放资源再重跑,或者 加资源 如果有相关思路可以评论区分享一些…谢谢

    2024年02月13日
    浏览(23)
  • Cadence常见问题:Analysis was skipped due to inability to compute operating point?

    Cadence常见问题:Analysis was skipped due to inability to compute operating point?

    题主使用门电路创建sr触发器电路图如下: 欲在sr端加电压pulse验证sr输出特性,遇到以下报错: 显示输出不收敛 解决方法: 题主是直接调用ahdlLib中的或非门,是理想或非门,所以造成不收敛的问题 用晶体管自己搭建或非门,封装好再调用,该问题就可以解决

    2024年02月13日
    浏览(7)
  • Expected one result (or null) to be returned by selectOne(), but found: 3报错解决方案

    Expected one result (or null) to be returned by selectOne(), but found: 3 Expected one result (or null) to be returned by selectOne(), but found: 3 意思是“期望selectOne()返回一个结果(或null),但发现3个”这说明你的返回结果有三个对象,但是selectOne只能返回一个。 第一种方案:可以把selectOne更换为selectList,

    2023年04月13日
    浏览(9)
  • NonHashException: For “.“ left-hand operand: Expected a hash, but this has evaluated to a string

    使用FreeMarker,遇到的问题: For \\\".\\\" left-hand operand: Expected a hash, but this has evaluated to a string 出错代码: list中有个对象a,然后使用#assign设置全局变量,下面取值报错。 问题原因: 因为list中的对象a是null,经过自动转化后b成了字符串,所以下面的取值判断会报错: For \\\".\\\" left-hand

    2024年02月13日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包