更新失败时Mysql事务回滚

标签 mysql sql transactions innodb

用一个简单的事务作为

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

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

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

最佳答案

这是在 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

关于更新失败时Mysql事务回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9327668/

相关文章:

transactions - 使用 JOliver EventStore 更新多个聚合

azure - Azure 表存储中跨多个表的事务

字段列表中的mysql未知列

php - 从 mysql 选择在 jQuery fancybox 中不起作用

java - 我们可以将Java中字符串中开头和结尾有符号的部分替换为Identify吗?

mysql - 在 SQL 的一个输出中组合表值

php - 使用单个php表单在多个Mysql表中插入数据

mysql - SQL创建矩阵表

mysql - 年度 SQL 总计以及设置期间

.net - TransactionScope一直在努力提升到MSDTC