代码之家  ›  专栏  ›  技术社区  ›  Jack Edmonds

在事务内保留自动增量ID

  •  2
  • Jack Edmonds  · 技术社区  · 16 年前

    假设我有两个表,用户和组,每个表都有一个自动递增的主键。无论何时创建新用户,我都希望与该用户一起创建一个组(同时/同一事务)。但是,用户需要知道他们属于哪个组,因此每个用户存储一个组ID。

    为了做到这一点,我创建了一个组并将其插入到数据库中,找出刚才插入的组的主键是什么,最后用新组的主键插入用户。

    请注意,我需要将组提交到数据库(这样,在提交用户的事务之外也可以将其提交),以便检索分配给它的主键。

    虽然这在大多数情况下都有效,但是如果在插入组和找出其主键之间存在某种故障(电源故障、系统崩溃等),并且在插入用户时,最终会得到一个不一致的数据库。

    是否有一种方法可以做一些类似于临时保留主键的事情,以便系统崩溃时不会以不一致的状态结束?

    我主要关注MySQL数据库,但是如果在标准SQL中有什么东西允许我这样做(因此,与其他数据库后端兼容),我也有兴趣知道这一点。

    2 回复  |  直到 16 年前
        1
  •  2
  •   Eric Petroelje    16 年前

    简单,只需将这两个操作放在一个事务中即可。启动事务,创建组,创建用户,然后提交事务。

    SET autocommit = 0
    
    START TRANSACTION
    
    INSERT INTO Groups ...
    INSERT INTO Users ...
    
    COMMIT
    

    但是,您必须使用一个支持事务(如innodb)的引擎才能使表正常工作。默认的myisam引擎不支持事务。

        2
  •  0
  •   cherouvim    16 年前

    如果您使用事务,那么您就没有问题了。