2012-02-17 12 views
10

Dzięki prostej transakcji jakoMysql wycofywania transakcja na niepowodzenie w aktualizacji

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

Chcę wykonać transakcję tylko raz podczas zmiany statusu; ale powyższe UPDATE nie spowoduje błędu wycofania transakcji, gdy żaden wiersz nie zostanie zaktualizowany.

W jaki sposób ograniczyć transakcję do zatwierdzenia tylko w przypadku aktualizacji wiersza (co oznacza zmianę statusu).

Odpowiedz

11

Tutaj PHP (nie badane , wymaga dostosowania do Twojej sytuacji):

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'); 
} 

lub, jeśli chcesz być mądry i zrobić to w SQL (przy użyciu ROW_COUNT() i 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

Perfect! W rzeczywistości jestem w PHP :) – Googlebot

+0

@Ali Zalecam aktualizację tagów niż: P – Vyktor

+0

Nie uruchamiaj "innych zapytań", a następnie wycofuj je, to trochę za mało. Po prostu przenieś je do tego samego bloku kodu, co COMMIT, tak aby były wykonywane tylko w razie potrzeby (w przeciwieństwie do wykonywania zawsze, a następnie ich cofania). – MatBailie

5

Będziesz musiał to zrobić w jakiejś logice programistycznej - być może procedura składowana jest najlepsza.

  • START TRANSACTION
  • prowadzony UPDATE zapytanie
  • SELECT ROW_COUNT() w some_variable
  • IF (some_variable>0) THEN [prowadzonych w innych informacji, w tym COMMIT] ELSE ROLLBACK