2015-10-20 58 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