2012-02-17 16 views
10

Con una semplice operazione comeMysql transazione rollback in caso di errore in aggiornamento

START TRANSACTION; 
UPDATE posts SET status='approved' where post_id='id' AND status != 'approved'; 
.. other queries ... 
COMMIT; 

voglio eseguire l'operazione solo una volta quando si cambia lo stato; ma il precedente UPDATE non restituirà un errore per il rollback della transazione quando nessuna riga viene aggiornata.

Come limitare la transazione al commit solo se la riga viene aggiornata (intendo lo stato modificato).

risposta

11

Qui è in PHP (non ho provato , ha bisogno di adattarsi alla tua situazione):

mysql_query('START TRANSACTION;') 
mysql_query("UPDATE posts SET status='approved' where post_id='id' AND status != 'approved';"); 
if (mysql_affected_rows()){ 
    mysql_query('COMMIT'); 
} else { 
    mysql_query('ROLLBACK'); 
} 

Oppure, se si vuole essere intelligente e di farlo in SQL (utilizzando ROW_COUNT() e IF):

START TRANSACTION; 
UPDATE posts SET status='approved' where post_id='id' AND status != 'approved'; 
SELECT ROW_COUNT() INTO @affected_rows; 
-- .. other queries ... 
IF (affected_rows > 0) THEN 
    COMMIT; 
ELSE 
    ROLLBACK; 
END IF 
+0

Perfetto! In effetti, sono in PHP :) – Googlebot

+0

@Ali Raccomando di aggiornare i tag rispetto a: P – Vyktor

+0

Non eseguire "le altre query" e quindi ripristinarle, è un po 'inutile. Basta spostarli nello stesso blocco di codice di COMMIT, in modo che vengano eseguiti solo se necessario (al contrario di eseguire sempre, quindi di eseguire il rollback a volte). – MatBailie

5

Avrete bisogno di fare questo in una sorta di logica di programmazione - forse una procedura memorizzata è la migliore.

  • START TRANSACTION
  • corsa UPDATE interrogazione
  • SELEZIONE ROW_COUNT() INTO some_variable
  • IF (some_variable>0) THEN [Esegui le altre dichiarazioni compresi COMMIT] ELSE ROLLBACK
Problemi correlati