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 字段的,

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

4980 次点击
所在节点    Python
31 条回复
geying
2019-11-29 11:05:05 +08:00
@markgor 老哥真走心 顶你
VictorJing94
2019-11-29 11:49:59 +08:00
....这个应用不对吧...什么情况下会需要同时创建 class 和 student 呢...楼主不妨再好好思索一下
Joyboo
2019-11-29 12:02:24 +08:00
还是用事务吧,外键一堆坑
julyclyde
2019-11-29 14:21:56 +08:00
@VictorJing94 显然你是对的,且仅你是对的
reus
2019-11-29 15:11:02 +08:00
事务都不知道,建议返厂重修。
ukipoi
2019-11-29 15:12:39 +08:00
@VictorJing94
学生必须在一个班里才被记录成本校学生。
学校不限制招生。
一个班级满了,会新开一个班来安排学生。
这种情况算么?
luofan004
2019-11-29 15:28:32 +08:00
你们再这样子,吓得楼主都不敢问问题了。
waterlaw
2019-11-29 15:51:18 +08:00
mysql 的事务是通过锁保证的,acid 严格来说不一定对,可以看下数据库的共享锁,写锁,排他锁,以及快照读(一个事务获得写锁修改另一个事务可以读该记录最近的快照), 一致性就事务加回滚,spring 的话就 @Transactional(propagation=Propagation.REQUIRED, rockbsck=Exception.class), 用 mysql 默认可重复读隔离级别就可以了
akira
2019-11-29 16:58:13 +08:00
就这个场景而言。。并不需要那么严谨。。
VictorJing94
2019-11-29 17:20:32 +08:00
@ukipoi 不算吧,反正多操作就是事务,场景举例不对就是了,我也就吐槽一下不严谨的举例
markgor
2019-11-29 18:20:54 +08:00
@ukipoi 有點牛角尖了吧...
第一步,必須是查班級有沒滿,滿了就丟去另一個班。返回班級 ID。
第二步,把第一步返回的班級 ID 記錄進學校的表裡。

你的條件是:
學生必須綁定班級才算本校學生。
班級滿了開新班,但不限數量。

所以根據條件,流程自然是先檢查班級人數是否滿再做對應業務邏輯。
第二步是把第一步的班級 ID 記錄進學校裡,
最後得出的結果就是這個學生是 XXX 班 XXX 學校的學生。

A.ID 對應 B.AID 就註定了是必須先有 A 才有 B。

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

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

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

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

© 2021 V2EX