根据计数限制插入

时间:2015-10-20 09:02:22

标签: mysql transactions

因此,我需要根据同一个表中其他条目的数量安全地限制表中条目的插入。假设我们有下表:

资源:(id,foreign_key)

我需要根据外键创建多个条目。所以,一旦我达到计数,让我们为我们的例子说100,我想限制创建更多的条目。

明显的答案是这样的:

  1. 使用指定的外键计数条目。
  2. 如果计数<限制插入新条目
  3. 事实上,这就是我一直在使用的东西。问题是,这种方法不是防故障的,因为在1和2之间可能会发生另一次插入。我考虑过使用交易的可能性,但(除非我完全误解交易)这有同样的问题:

    1. 启动交易
    2. 插入新条目
    3. 如果条目超出限制,则回滚。否则提交
    4. 现在,我们已经有99/100个条目和两个同时运行的事务。他们都会承诺,因为他们没有看到彼此的参赛作品。

      没有实际创建条目然后删除它,如果它无效(在我的脑海里感觉有点混乱),我无法想出解决这个问题的方法。有任何想法吗?

      编辑:根据要求我提供样本数据:

      表1 +-------------+------------------+------+-----+----------------+ | Field | Type | Null | Key | Extra | +-------------+------------------+------+-----+----------------+ | id | int(10) unsigned | NO | PRI | auto_increment | | limit | int(10) unsigned | NO | MUL | | +-------------+------------------+------+-----+----------------+

      表2 +-------------+------------------+------+-----+----------------+ | Field | Type | Null | Key | Extra | +-------------+------------------+------+-----+----------------+ | id | int(10) unsigned | NO | PRI | auto_increment | | foreign_id | int(10) unsigned | NO | MUL | | +-------------+------------------+------+-----+----------------+

      以及一些示例数据:

      表1 +----+----------+ | id | limit | +----+----------+ | 1 | 5 | +----+----------+

      表2 +----+---------------+ | id | foreign_id | +----+---------------+ | 1 | 1 | +----+---------------+ | 2 | 1 | +----+---------------+ | 3 | 1 | +----+---------------+ | 4 | 1 | +----+---------------+

      此时,让我们说两个用户尝试创建table2条目。第一个将被接受,第二个被拒绝。

      使用第一种方法,如果两个用户都通过步骤1(计算旧条目)然后通过步骤2(插入新条目),则将创建两个条目。

      使用第二种方法,如果它们两者同时运行,它们将在它们自己之前计算4个槽并提交而不是其中一个回滚。

1 个答案:

答案 0 :(得分:0)

Halo Mate,类似于此结构的存储过程可能会对您有所帮助

更新

DROP PROCEDURE IF EXISTS sp_insert_record;
DELIMITER //
CREATE PROCEDURE sp_insert_record(
    IN insert_value1 INT(9),
    IN chosen_id INT(9)
)
BEGIN
    SELECT id, `limit`
    INTO @id, @limit
    FROM table1
    WHERE id = chosen_id;

    START TRANSACTION;

        INSERT INTO table2 (id, foreign_id)
        VALUES (insert_value1, chosen_id);

        SELECT COUNT(id)
        INTO @count
        FROM table2
        WHERE foreign_id = @id;

    IF @count <= @limit THEN
        COMMIT;
    ELSE
        ROLLBACK;
    END IF;
END//
DELIMITER ;  

通过使用存储过程,您还可以根据您的要求添加任何验证或过程。

希望这可以帮助,干杯!

相关问题