天天视讯!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 Grouphub := client.Group.        Create().        SetName("GitHub").        SaveX(ctx)// Add Usersbulk := 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集群下

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

关键词:

为您推荐

天天视讯!ent M2M模型在pxc集群中的一个大坑

entM2M模型在pxc集群中的一个大坑事故简要分析PXC集群3个节点,在插入数据时,如果使用数据库自己生成的主

来源:博客园2023-05-18

阿里电话会:各个业务部门拆分上市后将自负盈亏|世界看点

阿里巴巴高层透露,集团首要资金来源仍是淘宝天猫集团,2023财年该业务产生250亿美元自由现金流。未来进一

来源:华尔街见闻2023-05-18

环球今热点:大卫猩球装置、铅笔微雕作品、匈牙利生肖邮票……文化市集首次亮相中国—中东欧博览会

5月16日至20日,第三届中国—中东欧国家博览会在浙江宁波举行。

来源:中国青年报客户端2023-05-18

筑牢防汛堤坝,扛稳抗旱重任 南京市积极准备应对汛期到来

5月18日,南京市2023年全市防汛抗旱工作准备情况新闻发布会。南京市水务局、市防汛抗旱指挥部办公室相关负

来源:中国日报网2023-05-18

ST信通: 亿阳信通关于延期回复上交所对公司2022年年度报告的信息披露监管问询函的公告|快播

ST信通:亿阳信通关于延期回复上交所对公司2022年年度报告的信息披露监管问询函的公告

来源:证券之星2023-05-18

旧石器时代和新石器时代的区别与联系_旧石器时代和新石器时代的区别

1、主打不同:旧石器时代以使用打制石器为主,新石器时代以使用磨制石器为主。2、旧石器时代是采集和渔猎经

来源:互联网2023-05-18

数据通|TMT板块主流热点回归,机构资金13亿元抢筹拓尔思-全球新视野

5月18日,沪指维持窄幅震荡格局,收盘涨13点。两市成交8800亿元,比昨天增加1000亿元。机构资金转为小幅流

来源:证券市场红周刊2023-05-18

GPD新翻盖WIN掌机上架:R7 7840U+32G 6699元! 每日热文

GPD日前发布的WINMax22023掌机现已上架,最高搭载R77840U处理器,国行预售价格如下:

来源:游民星空2023-05-18