ent M2M模型在pxc集群中的一个大坑

这篇具有很好参考价值的文章主要介绍了ent M2M模型在pxc集群中的一个大坑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ent M2M模型在pxc集群中的一个大坑

事故简要分析

PXC集群3个节点,在插入数据时,如果使用数据库自己生成的主键,一般顺序为1,4,7,10…

这里就是坑的源头,在ent底层代码中,在做M2M模型插入时,会先插入两个模型,再插入中间表。即,假设M2M模型为group和user(https://entgo.io/docs/schema-edges#m2m-two-types),这里数据库会产生3张表,users, groups 和 user_groups,其中user_groups存放userid和groupid,这样就组成了一个多对多模型。

事故复原

假设先插入一个group,再插入一堆user,而在使用ent的CreateBulk插入user时,问题就发生了,我们在测试环境永远无法复现出问题,而只要一上生产环境,问题必然出现。原因就在于测试环境使用单节点mysql,生产环境使用的pxc集群!

先看插入代码:

// Add Group
hub := client.Group.
        Create().
        SetName("GitHub").
        SaveX(ctx)

// Add Users
bulk := make([]*User, len(users))
for i, user:= range users {
			bulk[i] = client.User.
        Create().
        SetAge(30).
        SetName("a8m").
        AddGroups(hub)
}
_, err = client.User.CreateBulk(bulk...).Save(ctx)
if err != nil {
	return errors.Wrap(err, "User.CreateBulk") // pxc集群必然报错
}

源码分析

.Save()中调用了BatchCreate,又跳转nodes

nodes中主要两行代码是batchInsert和batchAddM2M,直观理解就是,先插入users,在插入user_groups,而插入user_groups时需要拿到所有users的id,由于我们是在一个事务里完成的,因此实际数据并未真正插入,因此ent做了一个看起来没问题的骚操作。

从batchInsert到c.insertLastIDs

重点来了,MySQL数据库id的处理结果是插入一条,剩下的数据加1,这是理想情况。比如插入时,第一条user的id是4,那剩下的id就是5,6,7,8,9…,但实际上,pxc集群处理时并不是这样,因此造成插入users时,id实际是4,7,10,13…,因此最终执行M2M插入操作时报错:add m2m edge for table

正确的应该是1,4 1,7。于是报错:Error 1452: FOREIGN KEY constraint failed

解决方式

PXC集群下文章来源地址https://www.toymoban.com/news/detail-449588.html

  • 能不用M2M就不用M2M。M2M改O2M;
  • 必须使用M2M时,不使用CreateBulk。该批量为单条;
  • 必须使用CreateBulk时,手动指定id。自行使用分布式id。

到了这里,关于ent M2M模型在pxc集群中的一个大坑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【一个大坑,持续更新】番外之区块链之创建泰安链账户、泰安链项目和生成公钥私钥

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 提示:这里可以添加本文要记录的大概内容: 最开始了解BSN是因为BSN的开发者大赛,如果你想尝试一下开发或学习区块链的相关知识,我认为是一个很好的入门平台。 来看一下它的简介: 区块链服务网

    2024年02月03日
    浏览(46)
  • 如何试用 Ollama 运行本地模型 Mac M2

    首先下载 Ollama 安装完成之后,启动 ollma 对应的模型,这里用的是 qwen:7b 命令与模型直接交互 我的机器配置是M2 Pro/ 32G,运行 7b 模型毫无压力,而且推理时是用 GPU 进行运算的,可能就是 Ollama 底层是用 llama C++ 实现的,底层做了性能优化,对 Mac特别友好。 纯C/C++实现,没有

    2024年04月10日
    浏览(41)
  • MLC-LLM 部署RWKV World系列模型实战(3B模型Mac M2解码可达26tokens/s)

    我的 ChatRWKV 学习笔记和使用指南 这篇文章是学习RWKV的第一步,然后学习了一下之后决定自己应该做一些什么。所以就在RWKV社区看到了这个将RWKV World系列模型通过MLC-LLM部署在各种硬件平台的需求,然后我就开始了解MLC-LLM的编译部署流程和RWKV World模型相比于MLC-LLM已经支持的

    2024年02月10日
    浏览(29)
  • Springboot引入elasticsearch-rest-high-level-client

    ES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请求发送给ES。官方文档地址:https://www.elastic.co/guide/en/elasticsearch/client/index.html 其中的Java Rest Client又包括两种: Java Low Level Rest Client Java High Level Rest Client 我这边以 Java High Level Re

    2024年02月03日
    浏览(28)
  • 使用matlab对simlink模型循环仿真,每仿真一次改变simlink中的某一个元件参数一次

    在MATLAB中,您可以使用Simulink API对Simulink模型进行操作,包括更改参数和执行仿真。可以通过以下步骤来实现您所需的循环仿真: 打开Simulink模型,选定要更改的参数。 使用Simulink API获取模块句柄并更改相应的参数值,例如: 执行Simulink模型仿真,使用Simulink API自动化执行操

    2024年02月13日
    浏览(37)
  • springboot引入elasticsearch-rest-high-level-client出错

    文章目录 前言 一、引入依赖 总结 引入依赖elasticsearch-rest-high-level-client后出现错误   引入依赖httpcore即可 HttpCore 是一套的组件执行的最基本的方面. 1.提供一致的 API,用于构建客户端/代理服务器/服务器端 HTTP 服务.2.提供一致的 API 构建同步和异步 HTTP 服务. 3.本身是基于阻塞

    2024年02月11日
    浏览(35)
  • 用 7 行代码在本地运行 Llama 2!(苹果silicon-mac m1 m2)项目源码含模型

    总而言之: 注意:7B 型号重量约为 4GB,请确保您的机器上有足够的空间。 这是使用 Georgi Gerganov 令人惊叹的llama.cpp项目来运行 Llama 2。它通过TheBloke的 Huggingface 存储库为 Llama 7B Chat 下载一组 4 位优化的权重,将其放入 llama.cpp 中的模型目录中,然后使用 Apple 的 Metal 优化构建

    2024年02月15日
    浏览(54)
  • Django的mysql数据库问题:同一个模型(同一张表)中的不同记录也是可以相互关联的【使用“自引用关系”】

    是的,确实可以在Django的模型中使用外键来建立同一模型中不同记录之间的关联关系。这样的关联关系被称为自引用关系(self-referential relationship)或者自关联关系。通过在模型中定义外键字段,你可以使模型的实例与同一模型中的其他实例产生关联。 在Django中,这通常通过

    2024年01月18日
    浏览(41)
  • 【动画详解人工智能原理】Tranformer 模型中的注意力机制的工作过程是怎样的 ?一个带有注意力的 Seq2seq 模型的机制实例视频动画详细讲解

    Seq2seq 序列到序列模型是深度学习模型,在机器翻译、文本摘要和图像字幕等任务中取得了很多成功。谷歌翻译于 2016 年底开始在生产中使用此类模型。两篇开创性论文(Sutskever 等人,2014 年,Cho 等人,2014 年)对这

    2024年02月07日
    浏览(39)
  • Swagger 大坑 之 @ApiModelProperty 注解的大坑

    Swagger页面上突然少了一个接口集;@ApiModelProperty注解是不能修饰public修饰的类属性的 一、注解介绍: @ApiModelProperty注解 是一个用来标注类属性的注解 它常用的属性有如下几个 1、name:重写属性名。 2、value:属性的中文描述。 3、dataType:重写属性类型。 4、required:是否必须

    2024年02月14日
    浏览(27)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包