假设我有两个表,用户和组,每个表都有一个自动递增的主键。无论何时创建新用户,我都希望与该用户一起创建一个组(同时/同一事务)。但是,用户需要知道他们属于哪个组,因此每个用户都存储group_id。
为了做到这一点,我创建了一个组并将一个组插入到数据库中,找出我刚刚插入的组的主键是什么,最后插入具有该新组主键的用户。
请注意,我需要将该组提交到数据库(因此将其置于提交用户的任何事务之外),以便检索它所分配的主键。
虽然这在大多数情况下都有效,但如果在插入组并找到其主键之间出现某种故障(电源故障,系统崩溃等),并且当我插入用户时,我会最终得到一个不一致的数据库。
有没有办法暂时保留主键,以便在系统崩溃时,它不会以不一致的状态结束?
我主要关注的是MySQL数据库,但是如果标准SQL中有一些东西允许我这样做(因此,与其他数据库后端兼容),我也有兴趣了解它。
答案 0 :(得分:2)
很简单,只需将两个操作放在一个事务中。启动事务,创建组,创建用户,然后提交事务。
SET autocommit = 0
START TRANSACTION
INSERT INTO Groups ...
INSERT INTO Users ...
COMMIT
您必须为您的表使用支持事务的引擎(例如InnoDB)才能使其正常工作。默认的MyISAM引擎不支持事务。
答案 1 :(得分:0)
如果您使用交易,那么您将没有问题。