即使其中一个操作失败,事务也不会失败

时间:2017-07-03 11:22:43

标签: mysql sql transactions commit acid

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

以下是此输出:

enter image description here

我在这里缺少什么?

3 个答案:

答案 0 :(得分:1)

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

您已提交交易,因此所有更改都会生效。

如果您想测试交易,请回滚交易。然后,当你查看数据时,你会发现没有任何改变。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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);