mysql 的两条数据同时保存成功问题

2019-11-29 09:43:23 +08:00
 kayseen

比如现在有两张表,分别是class表和studend表,

现在两张表都是空的,并且在student表里面有一个字段是class_id,

两张表需要同时新建一条数据: class1student1,

并且student1class_id字段需要指向class1的 id,

请问这种场景应该怎么实现才能让他们保持一致性,并且student1class_id可以指向class1的 id?

因为class1没有保存的时候,是没有 id 字段的,

还是说这种场景下不能保持一致性啊

4960 次点击
所在节点    Python
31 条回复
kayseen
2019-11-29 09:44:36 +08:00
简单描述的话, 就是两条数据需要同时保存成功,但是在一条数据里需要记录另外一条数据的 id......
ysoserious
2019-11-29 09:45:58 +08:00
事务
joyme
2019-11-29 09:46:44 +08:00
事务不能解决这个问题吗
Reficul
2019-11-29 09:50:06 +08:00
事物,非要强一致可以加外键。不一致不会死人就程序逻辑保证
littleylv
2019-11-29 09:58:35 +08:00
你说的同时是有多同时啊
0.000000000000001 秒的同时吗
先插入 class1,得到 class1 的 id,再插入 student1,放到事务执行,也可以说是同时啊
hmxxmh
2019-11-29 09:59:39 +08:00
事务加外键吧,django 可以用 with transaction.atomic()进入事务
markgor
2019-11-29 10:07:06 +08:00
別來騙代碼,如果連這也偷懶,你技術的道路也走到盡頭了。
如果你是剛學,那給思路你沒問題。
開啟事物。
插入 class 表,獲取 insertid。
插入 studend 表
任何一部出錯,都 rollback,
成功都 commit。
kayseen
2019-11-29 10:10:08 +08:00
@markgor
谢谢你帮忙解答,是新手,但是从头到尾我说要代码了吗?还有技术的道路走到尽头???
rockyou12
2019-11-29 10:11:29 +08:00
@kayseen 应为你这个问题太过低级……任何看过一点数据库文档的人都不会问你这个问题……
kayseen
2019-11-29 10:11:45 +08:00
@ysoserious
@joyme
@Reficul
@littleylv
@hmxxmh
谢谢大家解答,现在知道了,本来知道可以事务操作,不知道事务之后会有数据的 id,感谢
kayseen
2019-11-29 10:12:20 +08:00
@rockyou12
好的,大神
justRua
2019-11-29 10:12:48 +08:00
class1 没有保存的时候,是没有 id 字段的。你可以用某些规则生成 id,这样两条插入语句就可以并行执行。例如:用 crc32 计算 className 的值,再在插入的时候指定 classId 就好了
kayseen
2019-11-29 10:14:22 +08:00
@justRua
嗯呢,谢谢啦, 我本来也是纠结不保存没有 id 的问题,上面各位介绍了事务之后就有 id 了,可以看下
dongisking
2019-11-29 10:37:22 +08:00
不建议增加外键,7#的方法可取
tulongtou
2019-11-29 10:39:05 +08:00
事务都有 flush 和 commit 两种动作,flush 的时候就有 id 了,这个时候还可以 rollback,commit 之后就不能 rollback 了
blodside
2019-11-29 10:40:37 +08:00
先整个数据库的课看看吧。不用直接看文档,比到处问来的效率高。
事务的基础知识包括:CAID、4 种隔离级别之类的。
justRua
2019-11-29 10:40:41 +08:00
mysql 通过 SELECT LAST_INSERT_ID()可以拿取到,你这不就是获取自增 id 的问题么。还以为你要多线程并发插入
MatthewHan
2019-11-29 10:42:16 +08:00
ACID 数据库本身就是可以保证原子性的,假设在代码中是 2 个步骤对持久层的处理,把这个两步当做一个整体,要么全部执行,要么全部不执行。
augustpluscn
2019-11-29 10:59:36 +08:00
事务,class 保存后不用等 commit 就能获取到 id 了
markgor
2019-11-29 11:01:48 +08:00
@kayseen

比如现在有两张表,分别是 class 表和 studend 表,
:有兩張表

现在两张表都是空的,并且在 student 表里面有一个字段是 class_id
:裡面一個字段叫 class_id

两张表需要同时新建一条数据: class1 和 student1,
:無法理解同時插入 class1 和 studen1 數據,畢竟上面沒提過字段,唯一字段是 class_id,這行自行腦補為各插入數據

并且 student1 的 class_id 字段需要指向 class1 的 id,
:student1.class_id 對應 class1.id;(上面表名是 class 和 studend 這裡就變了,也自行腦補算了。)

请问这种场景应该怎么实现才能让他们保持一致性,并且 student1 的 class_id 可以指向 class1 的 id?
:如何保持 student1.class_id 對應 class1.id 的關係。

因为 class1 没有保存的时候,是没有 id 字段的,
:那如果先保存 class1 會導致什麼後果?

还是说这种场景下不能保持一致性啊
:請問你試過了嗎?自己試出來的才是真諦。


另外,
不是事务之后会有数据的 id,
你只要 ID 是使用 AI 的,插入後都能獲取自增 ID。
事物的開啟是為了保證第二句插入的時候有意外能把第一步的操作取消了(回滾)。


最後,我語言可能有些偏激。
我意思是如果你非新手問這樣的問題,你技術道路基本是走到盡頭了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/624181

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX