什么是提交事务和回滚事务啊?

我记得上次我帮邻居老王修电脑。
我记得存储照片的硬盘突然蓝屏了。
他满头大汗,因为他担心里面有一些重要的结婚照。
他说,这是百年难得一遇的机会。
我赶紧打开电脑,发现系统正在提示我自己处理“事务”问题,说还没写完数据就丢失了。
当时我想,我们在这台电脑上做的就是“生意”。
全部完成或未完成。
什么也没发生。

然后,一边看着服务局正在处理的客户信息。
一位年轻人专门谈到了向数据库“提交交易”。
他说,他们的系统里有一个规则,如果超过1 0个动作,就必须手动验证,否则会自动保存。
如果突然停电,所有未提交的作业都会丢失,就像未完成的作业被撕毁一样。
最有趣的是他给我展示了回滚功能。
当时,客户不小心删除了3 00多条记录,但通过“回滚”将它们全部恢复了。
使用了命令。
这一招据说比魔法还要神奇。

等一下,这就像我们小时候玩的“翻牌记忆”游戏。
事情发生得很突然。
如果你不记得每张卡片的位置,你就什么也记不住。
然而,数据库“事务”并不那么简单。
必须使用复杂的算法来记录每个动作步骤。
我突然想到,如果我能把这些要点画成漫画,那就比说明书有趣多了。

如果在当前事务的中间执行 START TRANSACTION 命令,当前 MySQL 事务会发生什么?

哎,说到MySQL隐式从属,其实我是有话要说的。
记得有一天我在项目中认真的写SQL语句,突然想插入一个新的事务,于是我就随机想到了START TRANSACTION。
结果我连反应都没有。
之前的所有交易均已提交,数据已直接写入数据库。

我当时就很困惑,想知道这个东西为什么这么聪明,所以就直接发了。
查了资料,发现这是MySQL的一个特性,叫做隐式表示。
只需在事务中间发出 START TRANSACTION,MySQL 将自动提交当前事务并启动一个新事务。

我当时就不明白,这个新物质怎么能独立于旧物质呢?如果你稍后考虑一下,这可能是因为当MySQL执行START TRANSACTION时,它首先提交当前事务,然后创建一个新的事务上下文,因此所有后续操作都是新事务。

不过,这件事也存在风险。
比如你一开始想分几步进行,结果中间不小心出现了START TRANSACTION消息,前面的操作都被发送了,这就破坏了事务的原子性。
当时,我开始有些激进地思考:为什么 MySQL 不给人们一种生存之道?
所以后来写代码的时候,我非常小心,尽量不要在事务中间做START TRANSACTION。
如果您确实需要跨段控制事务,我仍然倾向于使用 COMMIT 或 ROLLBACK 来严格控制事务边界。
归根结底,当涉及到保存数据时,您仍然需要自己控制。

postgresql数据库中psql工具常用命令(五)

BEGIN 开始一个新事务。
COMMIT 一旦传输,数据就是永久性的。
ROLLBACK 取消事务并回滚数据。
-a 或 --echo-all;禁用自动提交。
-E参数;查看底层 SQL 的操作。
更改未提交,并且从其他会话中不可见。
凭经验来说,掂量一下自己。