GORM 并发执行 Save 更新记录报:Error 1062 (23000)

news2024/12/28 17:47:09

文章目录

  • 1.Save 简介
  • 2.问题
  • 3.原因
  • 4.小结
  • 参考文献

1.Save 简介

先看一下 Save 方法的描述:

// Save updates value in database. If value doesn't contain a matching primary key, value is inserted.
func (db *DB) Save(value interface{}) (tx *DB)

Save 有两个作用,创建或更新。如果待保存的值不包含主键,则执行 Create,否则执行 Update(包含所有字段)。

如果是执行 Update 的话,模型字段即使是零值也会更新。这一点与 Updates 方法不同,Updates 默认只会更新非零值。

2.问题

在使用 GORM v1.24.6 时,在并发调用 Save 方法更新同一个记录会报如下错误:

Error 1062 (23000): Duplicate entry 'xxx' for key 'PRIMARY'

奇怪的是,串行调用则不会报错。

无独有偶,我发现在 GORM Github 仓库已经有人提了类似的 Issues。

Duplicate primary key error returned when saving unmodified object #6171

我在该 Issue 中也补充了我遇到的问题。

在这里插入图片描述
另外,我还测试了一下上一个版本 v1.24.5 没有这个问题,说明该 Bug 是版本 v1.24.6 引入的新 Bug,非历史遗留的 Bug。

3.原因

GORM 社区非常活跃,在我补充问题的当天便有人进行了回复。

在这里插入图片描述

从回复中可以看到,在 Issue #6171 之前,已经有人提了 PR #6149 来解决这个问题,只是还未被合入。

顺着回复的内容,找到 commit f387433,看了下提交内容。

在这里插入图片描述

从 commit message “Fix Save with stress tests” 和变更内容,推测 jinzhu 大佬是为了优化 Save 的更新性能,将插入前判断记录是否存在的条件去掉了,多次调用 Save 时,便出现了主键冲突的错误。

当天 Mar 23,jinzhu 大佬可能意识到了问题的存在,便将 PR #6149 合入到主干,修复了这个问题。

4.小结

如果大家遇到了同样的问题,请跳过 v1.24.6,使用之前或之后的版本,比如前一个版本 v1.24.5 或后一个版本 v1.25.0。

如果您喜欢这篇文章,欢迎关注微信公众号“恋喵大鲤鱼”了解最新精彩内容。


参考文献

Duplicate primary key error returned when saving unmodified object #6171

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/820896.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

lc1109.航班预定统计

暴力解法:按照示例在firsti到lasti遍历,将seati加到每个数上。时间复杂度取决于bookings的长度 一维差分:建立初始数组和差分数组,在差分数组的firsti位置加上seati,差分数组的lasti1位置减去seati(避免影…

偶数科技发布实时湖仓数据平台Skylab 5.3版本

近日, 偶数发布了最新的实时湖仓数据平台 Skylab 5.3 版本。Skylab包含七大产品,分别为云原生分布式数据库 OushuDB、数据分析与应用平台 Kepler、数据资产管理平台 Orbit、自动化机器学习平台 LittleBoy、数据工厂 Wasp、数据开发与调度平台 Flow、系统…

vscode如何包含第三方库

方法1:使用C Extension 在include 的 rapidjson的头文件时,vscode会提示找不到的问题 悬停,点击黄色提示 Edit "includePath" setting Include Path,输入rapidjson的include路径 /Users/xxx/workspaces/rapidjson-1.1.…

服务器出入口IP通俗理解

一、出口IP 这是机房的网络设备(如防火墙)给内网主机生成的一个外网IP,用来保证内网主机能和其他公网主机进行来回通信,通常作为其他接入方的IP白名单使用,一般有几台内网主机就有几个出口IP,出口IP通常和入…

TSINGSEE青犀视频AI算法引擎中台在渣土车智慧管控场景中的应用

一、行业背景 随着社会的发展和人们生活水平的不断进步,大家对环境卫生和空气质量的要求越来越重视。渣土车是建筑垃圾的运输主力,也存在行驶频繁、不合规、不合法的操作,可能对交通安全、环境卫生和城市形象造成影响。比如在施工工地&#x…

Django音乐电台推荐系统【纯干货分享,免费领源码00750】

摘要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中,应用软件的工作规…

【云原生】K8S超详细概述

目录 一、Kubernets概述1.1 K8S什么1.2为什么要用K8S 二、Kubernetes 集群架构与组件2.1Master组件Kube-apiserverKube-controller-managerKube-scheduler 2.2 配置存储中心etcd 2.3 Node 组件KubeletKube-Proxydocker 或 rocket 三、 Kubernetes 核心概念3.1Pod3.2Pod 控制器K…

WPF上位机5——C#运算符、特性、反射

C#运算符 按位操作 特性 预定义特性(内置) 自定义特性 通过特性获得数据表列的名称 反射 通过反射创建对象并调用对象的方法

【Vue组件eval方法的使用】

Vue页面中条件可以放在当前vue页面中而无需影响到组件 如 这是我的表格操作列按钮,需求是第四个按钮如果表格当前数据的is_execl字段为0则显示否则隐藏 这种条件判断很频繁 如果像之前一样给一个标识,页面多了就难以维护,而且判断条件如果不…

使用docker部署Wordpress

文章目录 1.创建网络2.创建volume存储3.拉取镜像4.创建mysql容器mysql修改密码 5.创建wordpress容器6.访问localhost:80就可以直接使用啦 1.创建网络 docker network create --subnet172.18.0.0/24 pro-net2.创建volume存储 # mysql 存储 docker volume create volume_mysql…

程序员成长之路心得篇——高效编码诀窍

随着AIGC的飞速发展,程序员越来越能够感受到外界和自己的压力。如何能够在AI蓬勃发展的时代不至于落后,不至于被替代?项目的开发效率起了至关重要的作用。 首先提出几个问题: 如何实现高效编程?高效编程的核心在于哪里&#xff…

无涯教程-Lua - 变量声明

变量的名称可以由字母,数字和下划线字符组成。它必须以字母或下划线开头,由于Lua区分大小写,因此大写和小写字母是不同的。 在Lua中,尽管无涯教程没有变量数据类型,但是根据变量的范围有三种类型。 全局变量(Global) …

功率信号源的输出阻抗是多大的

功率信号源是一种产生高功率信号的电子设备,它通常用于测试和测量、无线电通信、音频系统等领域。在实际应用中,功率信号源的输出阻抗对于整个电路的性能和准确性非常重要。 输出阻抗是指电路输出端产生的电阻值。在功率信号源中,输出阻抗通常…

【Linux详解】——进程间通信

📖 前言:本期介绍进程间通信。 目录 🕒 1. 理解进程间通信🕘 1.1 什么是通信🕘 1.2 为什么要有通信🕘 1.3 如何进行进程间通信 🕒 2. 管道🕘 2.1 匿名管道🕤 2.1.1 回顾文…

SpringBoot2学习笔记

信息来源:https://www.bilibili.com/video/BV19K4y1L7MT?p5&vd_source3969f30b089463e19db0cc5e8fe4583a 作者提供的文档:https://www.yuque.com/atguigu/springboot 作者提供的代码:https://gitee.com/leifengyang/springboot2 ----…

自动化测试指南:什么该自动化什么不该自动化

除了测试,测试数据创建、需求跟踪和测试报告等任务也可自动化。 什么应该被自动化? 与人工测试相比,具备明显收益如果失败会对业务造成相当大的损失的业务功能或用户流;自动化测试有助于经常验证这些功能。 需要针对应用程序的每个…

myeclipse的Debug模式

1.表示当前实现继续运行直到下一个断点,快捷键为F8。 2.表示打断整个进程 3.表示进入当前方法,快捷键为F5。 4.表示运行下一行代码,快捷键为F6。 5.表示退出当前方法,返回到调用层,快捷键为F7。 6.表示当前线程的…

硬核来袭!中国AI大模型峰会“封神之作”,开发者们不容错过!

2023年全球AI浪潮迭起,大语言模型热度空前,生成式人工智能为千行百业高质量发展带来更多想象空间。作为前沿科技风向标、汇聚全球开发者的顶级盛会,WAVE SUMMIT 2023深度学习开发者峰会正式定档8月16日,在北京望京凯悦酒店召开。本…

PCB制版技术03

5.21 P(W)改变折线 5.22 点击右键可以拐弯,点击左键可以取消 5.23 这三个点,代表着连接在一起的意思 5.24 把这个电阻和线一连 5.25 点一下,然后把点给拉回来 5.26 连接三极管,十电阻 5.27 对齐和对称就能够感觉很舒服&#xff0c…

Google OAuth 2 authorization - Error: redirect_uri_mismatch 400

出现这个问题,一般是因为google授权origin地址和重定向redirect_uri地址没有匹配上。 请仔细检查重定向地址的url中origin部分和授权origin部分是否能够匹配: