Откат транзакции MySQL при сбое в обновлении - PullRequest
10 голосов
/ 17 февраля 2012

С простой транзакцией как

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

Я хочу выполнить транзакцию только один раз при изменении статуса;но вышеприведенный UPDATE не выдаст ошибку для отката транзакции, когда строка не обновлена.

Как я могу ограничить транзакцию фиксацией только в том случае, если строка обновлена ​​(я имею в виду, что статус изменился).

Ответы [ 2 ]

11 голосов
/ 17 февраля 2012

Вот в PHP (не тестировал, нуждается в адаптации к вашей ситуации):

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

Или, если вы хотите быть умным и делать это в SQL (используя ROW_COUNT() и 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
5 голосов
/ 17 февраля 2012

Вам нужно будет сделать это в какой-то логике программирования - возможно, лучше всего использовать хранимую процедуру.

  • START TRANSACTION
  • run UPDATE query
  • SELECT ROW_COUNT () INTO some_variable
  • IF (some_variable>0) THEN [запустить другие операторы, включая COMMIT] ELSE ROLLBACK
...