2015-10-20 61 views
1

因此,我需要基于该表中其他条目的计数安全地限制条目在表中的插入。假设我们有如下表:根据计数限制插入

资源:(ID,foreign_key)

我需要创造了多项基于外键条目。所以,只要我达到一个数字,我们就说我们的例子为100,我想限制创建更多的条目。

显而易见的答案是这样的事情:

  1. 数与指定的外键的条目。
  2. 如果计数<限制插入新的条目

而事实上,这是我一直使用的是什么。问题是,这种方法并不能防止故障,因为在1和2之间可能会出现另一次插入。我认为用交易的可能性,但(除非我完全误解交易),这有同样的问题:

  1. 开始交易
  2. 插入新的条目
  3. 如果条目已经超过了极限,回滚。否则提交

现在,假设我们已经有99/100个条目和两个事务同时运行。他们都会提交,因为他们没有看到对方的条目。

实际上创建条目的缺点,然后删除它,如果它是无效的(我觉得有点麻烦)我想不出一种方法来解决这个问题。有任何想法吗?

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

table1的 +-------------+------------------+------+-----+----------------+ | 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 | | +-------------+------------------+------+-----+----------------+

和一些样本数据:

table1的 +----+----------+ | id | limit | +----+----------+ | 1 | 5 | +----+----------+

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

在这一点上,假设两个用户试图创建table2条目。第一个将被接受,第二个被拒绝。

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

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

+2

“我需要根据外键创建多个条目。”请更详细地解释这一点。样本数据和期望的结果总是一个好主意。 – fancyPants

回答

0

晕伴侣,类似于这样结构的存储过程可以帮助你

UPDATE

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 ; 

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

希望这可以帮助,欢呼!

+0

我可能不够清楚。我不想以编程方式创建100个条目,我希望我的用户能够创建一个条目,直到满足max_count。我的主要问题是这些请求确实发生得非常快(可能达到每秒100或200个峰值),并且在某些情况下,条目超出了限制,因为在计算@record_count和插入条目之间插入了另一个条目。 – Theodosis

+0

呦,可以试试更新的?干杯! – Avidos

+0

这是我提到的第二种方法,使用事务和提交/回滚。当多个交易同时运行时,它是否有同样的问题?由于交易无法看到从其他交易实例创建的数据,所以我猜想,如果我们有100和99个条目的限制,两个同时发生的实例将创建两个更多的条目。 – Theodosis