Откат транзакции Mysql при сбое в обновлении
С простой транзакцией как
START TRANSACTION;
UPDATE posts SET status='approved' where post_id='id' AND status != 'approved';
.. other queries ...
COMMIT;
Я хочу выполнить транзакцию только один раз при изменении состояния; но выше UPDATE
не даст ошибку для отката транзакции, когда ни одна строка не обновляется.
Как я могу ограничить транзакцию фиксацией только в том случае, если строка обновлена (я имею в виду, что статус изменен).
Ответы
Ответ 1
Вот в 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
Ответ 2
Вам нужно будет сделать это в какой-то логике программирования - возможно, хранимая процедура лучше всего.
-
START TRANSACTION
- выполнить
UPDATE
запрос
- SELECT ROW_COUNT() INTO some_variable
-
IF (some_variable>0) THEN
[запустите другие операторы, включая COMMIT
] ELSE ROLLBACK