2016-03-23 20 views
1

我需要將2行更新到2個不同的表中,然後將新行插入到另一個必須完成的不同表中,以使它們全部成功或失敗。 (我認爲這個詞是原子性的?)。我做了一些搜索,但似乎只能找到與多個插入或更新到一個表相關的問題。運行多個查詢,其中全部成功或全部失敗

下面是3個詢問我是否需要運行:

UPDATE submission SET status='a' WHERE idgreg = 119 AND status='p' AND userid = 126; 

UPDATE greg SET iscomplete=1 WHERE idgreg = 119; 

INSERT INTO completion (idperson, idgreg, datecompleted, idsubmission, mediaid, description, 
privatestatus, contenttype, totalamount) 
SELECT s.idperson, s.idgreg, s.datesubmitted, s.idsubmission, COALESCE(s.youtubeid, s.contentid) AS mediaidid, g.description, g.privatestatus, 
g.contenttype, COALESCE(SUM(amount),0) AS totalamount 
FROM submission s 
INNER JOIN greg g on s.idgreg = g.idgreg 
INNER JOIN contribution c on s.idgreg = c.idgreg 
WHERE s.idsubmission = 36 AND c.ispaid = 1; 

回答

1

你應該換一個MySQL 交易內查詢,以確保其執行的原子。但首先,聲明錯誤處理程序,它將在發生錯誤時發生所有更改:

CREATE PROCEDURE runYourQueries() 

BEGIN 

DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK; 
DECLARE EXIT HANDLER FOR SQLWARNING ROLLBACK; 

START TRANSACTION; 

UPDATE submission SET status='a' WHERE idgreg = 119 AND status='p' AND userid = 126; 

UPDATE greg SET iscomplete=1 WHERE idgreg = 119; 

INSERT INTO completion (idperson, idgreg, datecompleted, idsubmission, mediaid, description, 
    privatestatus, contenttype, totalamount) 
SELECT s.idperson, s.idgreg, s.datesubmitted, s.idsubmission, 
    COALESCE(s.youtubeid, s.contentid) AS mediaidid, g.description, g.privatestatus, 
    g.contenttype, COALESCE(SUM(amount),0) AS totalamount 
FROM submission s 
INNER JOIN greg g on s.idgreg = g.idgreg 
INNER JOIN contribution c on s.idgreg = c.idgreg 
WHERE s.idsubmission = 36 AND c.ispaid = 1; 

COMMIT; 

END 
+0

這是行不通的。我故意讓其中一個失敗,另外兩個查詢仍然更新。我在主要問題中添加了一張圖片來展示發生了什麼事。有任何想法嗎? – Mitchell

+0

您必須選擇一個**交易**引擎,如* InnoDb *。請參閱文檔https://dev.mysql.com/doc/refman/5.0/en/ansi-diff-transactions.html –

+0

@Mitchell您應該使用存儲過程來利用'ROLLBACK',它將撤銷發生錯誤時的一切。 –