更新失败时Mysql事务回滚

Goo*_*bot 10 mysql sql innodb transactions

用简单的交易作为

START TRANSACTION;
UPDATE posts SET status='approved' where post_id='id' AND status != 'approved';
.. other queries ...
COMMIT;
Run Code Online (Sandbox Code Playgroud)

我想在更改状态时只执行一次交易; 但是,UPDATE如果没有更新行,上面的内容不会给出回滚事务的错误.

如何在行更新时限制事务提交(我的意思是状态已更改).

Vyk*_*tor 11

这是在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');
}
Run Code Online (Sandbox Code Playgroud)

或者,如果你想聪明并在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
Run Code Online (Sandbox Code Playgroud)


Eug*_*eck 5

您需要在某种编程逻辑中执行此操作 - 也许存储过程是最好的.

  • START TRANSACTION
  • 运行UPDATE查询
  • SELECT ROW_COUNT()INTO some_variable
  • IF (some_variable>0) THEN[运行其他声明,包括COMMIT]ELSE ROLLBACK