如何在mysql中处理事务回滚异常

那天我在公司打工到半夜,突然发现转账只扣了钱,而没有添加到另一个账户上。
我赶紧查看日志,发现出现了异常,交易没有返回。
这个东西让我想起了MySQL的事务。

比如在杭州进行系统升级时,在解决支付接口时,发现数据库中InnoDB表和MyISAM表混合存在。
使用显示表条件作为“标签”;乍一看,有几个表还是MISAM。
这是不可能的。
MyISAM不支持回滚,所以我们必须直接使用InnoDB引擎。
不然万一出了问题,我们就得重新算账。
最让人头疼的是累积的过程。
去年我在北京做一个项目的时候,一个复杂的订单存储流程突然崩溃了。
我花了很长时间检查才意识到我忘记添加特殊处理。
稍后,为 SQLEXECEPTION 和 RETURN 声明退出处理程序。
release 它们添加在 DELIMITER // 之后。
从那时起,麻烦的迹象就出现了。

记得有一次使用Python调用MySQL时,忘记设置autocommit=False。
结果每次UPDATE都是自动输入,最后一半数据都是错的。
现在,在编写代码之前,您应该始终默读三遍:显式发起事务,捕获异常,并记住回滚。
就像开车一样,不管路有多畅通,你还是得踩刹车。

某些NoSQL数据库似乎不支持事务是偶然的吗?还是分布式事务更复杂?等等,还有一件事。
什么情况下MySQL读的隔离级别最合适?

什么是事务回滚?

我记得有一次,一个夏天的晚上,我独自坐在电脑前,尝试使用 MySQL 数据库来管理一张简单的学生信息表。
我输入了几条SQL语句,急切地等待数据更新。
突然出现错误信息,我意识到之前的操作出错了。
等等,还有别的事。
我突然觉得我好像忘记开始交易了。
于是我赶紧在命令行输入“START TRANSACTION”开始一个新的事务。

然后我尝试修复错误并再次输入更新指令。
这次一切顺利,数据更新成功。
时间过得真快。
我看了看手表,已经是晚上九点了。
然后我需要提交事务以确保保存所有更改。
我输入“COMMIT TRANSACTION”,屏幕上立即报告“交易成功完成”。

但是如果一切进展不那么顺利会发生什么?例如,如果我重新输入错误的 SQL 语句,我就必须回滚事务。
我试图重复之前的错误,并立即输入“ROLLBACK TRANSACTION”。
结果,你刚刚所做的所有改变都消失了,就好像它们从未发生过一样。

这个过程让我深刻认识到商业的重要性。
这不仅可以确保数据完整性,而且还可以让我在出现问题时快速恢复。
不过,它也提醒我在操作数据库时需要小心,尤其是在启动事务之后。
毕竟,一旦提交事务,所有更改都是永久性的。