即使其中一个操作失败,交易也不会失败

Transaction doesn't fail even if one of operations fails

所以我在玩交易,我试图从一笔交易中减去资金转移到另一笔交易。从图中可以看出,第一个更新查询没有成功……不像第二个,它执行成功了。现在,我所期待的是,当我提交时,我不会看到任何更改。但事实并非如此。此外,我使用 START TRANSACTION(它隐式地将 autocommit 设置为 0),而不是 BEGIN 命令。

这是这个的输出:

我在这里缺少什么?

我不明白你的困惑。您的两次更新都成功了。第一个碰巧没有影响任何行,所以只有第二个真正改变了数据。

您提交了事务,因此所有更改都会生效。

如果您想测试事务,请回滚事务。然后,当您查看数据时,您会发现没有任何变化。

您的任何操作都没有失败。

  1. 第一次更新时,条件不满足,因此没有任何 行已更新。
  2. 在第二个中,一条记录满足条件,因此更新了一条记录。

作为 和他提到的存储过程的补充,我会为未来的读者和完整性添加一个答案,因为我真正的问题是如果某些条件是如何回滚事务不满意:

DELIMITER //

CREATE PROCEDURE transfer(IN sender INT, IN receiver INT)

BEGIN

  START TRANSACTION;

   SET @senderBalance = (SELECT balance FROM bank_acc WHERE acctnum =  sender LIMIT 1);
   select @senderBalance;

    IF (@senderBalance < 50) THEN
      ROLLBACK;
    ELSE

    update bank_acc set balance = balance - 50 where acctnum = sender;
    update bank_acc set balance = balance + 50 where acctnum = receiver;

      COMMIT;
    END IF;
END//


DELIMITER ;

以后可以这样使用:

call transfer(@sender := 20, @receiver := 10);