所以我正在玩交易,我试图从一次转账中减去资金。从图中可以看出,第一个更新查询并不成功......与第二个更新查询成功执行的不同。现在,我所期待的是,当我点击提交时,我不会看到任何变化。但事实并非如此。另外,我使用START TRANSACTION
(它隐式地将autocommit设置为0),而不是BEGIN
命令。
以下是此输出:
我在这里缺少什么?
答案 0 :(得分:1)
我不明白你的困惑。您的更新都成功了。第一个碰巧没有影响任何行,所以只有第二个实际上改变了数据。
您已提交交易,因此所有更改都会生效。
如果您想测试交易,请回滚交易。然后,当你查看数据时,你会发现没有任何改变。
答案 1 :(得分:1)
您的任何操作都没有失败。
答案 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);