为什么 MySQL (MariaDB) 更新事务 returns '0 行受影响'?

Why MySQL (MariaDB) update transaction returns '0 row affected'?

我对 MySQL 有一些奇怪的看法。 (哦,首先,抱歉我的英语不好。)

我制作了简单的 table 和存储过程。 Table 定义是...

CREATE TABLE numTable (
    firstNum INT,
    secondNum INT
);
INSERT INTO numTable (firstNum, secondNum) VALUES (1, 2);

SP 是...

DELIMITER ;;

CREATE PROCEDURE updateNum (
    IN num1 INT,
    IN num2 INT
)

BEGIN

START TRANSACTION;

    UPDATE  numTable
    SET     firstNum = num1, secondNum = num2;

COMMIT;

END ;;

DELIMITER ;

然后我就这样执行了SP...

CALL updateNum (3, 4);

和MySQL returns ...

0 row(s) affected

当我看到这个结果时,我想 'Is there any syntax error?' 但是,不是。更新查询工作正常。 numTable 的数据从 (1, 2) 变为 (3, 4)。

我也发现了这个。我删除了 'START TRANSACTION;' 和 'COMMIT' 语句。并再次执行 updateNum SP。结果是...

1 row(s) affected

这一次,UPDATE 查询也运行良好。 numTable 的数据已成功更改。

为什么会出现这种差异?有没有一种方法可以使用 TRANSACTION 语句获得正确的受影响行?

我在 MySQL 5.6.27、MariaDB 10.0.21 和 MariaDB 10.1.8 上进行了测试,结果与上面相同。

感谢您阅读我的问题。

您将使用

获得受影响的行
ROW_COUNT()

所以,SELECT ROW_COUNT() 最后

与@Leow 类似,但我发现如果没有交易,并且没有在更新后立即发生,一切都会丢失。所以:

START TRANSACTION;
update ...
select row_count() into @theCount; -- saved for posterity, perhaps for use at end
COMMIT;
select @theCount;