2010-11-15 117 views
0

嘿,這裏是我無法弄清楚的一個。我們在數據庫中有一個表格,PHP插入記錄。我創建了一個觸發器來計算要插入的值。計算的值應該是唯一的。然而,我經常會發現表格中的幾行有完全相同的數字。該數字是年,月和日的組合以及當天的訂單數量。我認爲插入的單一操作是原子的,並且在事務正在進行時表被鎖定。我需要計算的值是唯一的...服務器版本是5.0.88。服務器是帶有雙核處理器的Linux CentOS 5。MySQL事務和觸發器

這裏是觸發:

CREATE TRIGGER bi_order_data BEFORE INSERT ON order_data 
FOR EACH ROW BEGIN 
    SET NEW.auth_code = get_auth_code(); 
END; 

相應的程序看起來像這樣:

CREATE FUNCTION `get_auth_code`() RETURNS bigint(20) 
BEGIN 
    DECLARE my_auth_code, acode BIGINT; 
    SELECT MAX(d.auth_code) INTO my_auth_code 
     FROM orders_data d 
     JOIN orders o ON (o.order_id = d.order_id) 
     WHERE DATE(NOW()) = DATE(o.date); 

    IF my_auth_code IS NULL THEN 
     SET acode = ((DATE_FORMAT(NOW(), "%y%m%d")) + 100000) * 10000 + 1; 
    ELSE 
     SET acode = my_auth_code + 1; 
    END IF; 
    RETURN acode; 
END 
+0

爲什麼不把時間縮短到ms。或者選擇一個序列/自動增量編號並添加它。 – Jules 2010-11-15 12:54:21

+0

我第二個自動遞增數字,如果你不使用某種內部方法的計數器,你將有競爭條件的風險 – ZaQ 2010-11-15 12:56:49

+0

那麼......每一行都有一個獨特的自動增量編號。但是,計數的數字用於其他目的。訂單被輸入到表格中,然後好的狀態機將它拿起併發送給遺留系統處理。表格中的順序隨着其在精狀態機中的進展而改變。舊系統支持所描述格式的10位數字。因此,添加自動增量會在系統完成9999次訂單後暫停系統... – user390133 2010-11-15 14:33:29

回答

2

我認爲 插入的單一操作是原子和表被鎖定 而交易是在進展

表中的任何一個被鎖定(使用MyISAM)或記錄可能被鎖定(使用InnoDB),而不是兩者。

既然您提到「交易」,我認爲InnoDB正在使用中。 InnoDB的優勢之一是沒有表鎖,所以沒有什麼會阻止許多觸發器的主體同時執行併產生相同的結果。