seegongsik
我的单词本
数据

同时写也不乱,事务

假设你给朋友转一万元。从你的余额里扣一万,再往朋友余额里加一万。两件都成了才算正常。可要是扣完了、正要加的时候电源突然断了呢? 你的钱没了,朋友却没收到。为了防这种事故,把几次改动当成一个整体来处理的办法,就是事务。

01

转账是扣和加,一对

前面我们学过,数据库
是安全存放信息的仓库。
可有时要改的不是一样东西,
而是得把两样一起改。
转账正是这样。
从你的余额里扣钱,
再往收款人余额里加上同样多。
这两样是拆不开的一对。
只成一样,立刻就出事。

我的余额30
朋友余额10
两者之和40
把两个按钮分开点

把扣和加分开点。只点一样,钱就会凭空消失或冒出来。

只点扣,你的钱就没了。
只点加,凭空多出钱来。
哪样都不对。
钱的总和变了。
扣和加之间那道短短的缝,
那里正是危险地段。
要是有什么挤进那道缝,
账本就对不上了。
所以需要一个办法把两样捆在一起。

02

要么全成,要么全不成

解决办法出人意料地简单。
把扣和加捆成一个整体。
这个整体叫事务。
捆里的每次改动都是暂时的。
全部完成才一次性真正生效,
哪怕只有一处对不上,就全部取消。
所以绝不会只剩一半。
要么全成,要么全不成。
中间状态谁也看不到。

一个整体 (事务)
放入扣
放入加
我的余额30
朋友余额10
把两次改动放进整体

当成一个整体来走。两次改动都备好了才确定,取消则两样都没。

两样一起确定,所以总和正好对。
点取消,两样都干净地消失。
不管哪样,钱的总和不变。
仅仅当成一个整体来处理,
那道危险的缝就没了。
这样要么全做要么全不做,
账本就绝不会对不上。
可要是在整体里干活的中途,
真的断电了,会怎样?

03

断了也整个退回

我们说过,整体里的改动是暂时的。
这份暂时,正是安全装置。
它没忘记动手前的状态,
而是另外记了下来。
所以中途断电也不怕,
回来一看就知道:
这个整体没能做完。
于是它不会只留一半,
而是退回到记下的之前状态,整个退回。

开始前的状态 (另外记下)30 / 10
我的余额30
朋友余额10
先走一步,再制造一次断开

先走一步,再点断开。它不会只留一半,而是整个退回到开始前。

断了,账本却好好的。
没有留下乱糟糟的一半,
而是干净地退回到开始前。
这样整个退回,叫回滚。
失败也不留痕迹,
大不了从头再来一遍。
有了它,就能放心把活交出去。
可要是几个人想把同一笔余额
同时改了,又会怎样?

04

同时来也轮着处理

在操作系统里见过类似的。
两个同时碰同一份资源,
结果就乱,那叫竞态。
余额也一样。
两个人同时读出余额,
各自把改后的值写回去,
后写的人就把前面的结果覆盖了。
一次改动整个没了。
所以让它们一个一个轮着处理,挡住。

人 X (+5)+5
人 Y (+8)+8
同一笔余额100
同时发出,一方覆盖另一方

把两个人同时发出去。放任不管,一方就覆盖、乱了,轮着挡住则两样都生效。

放任不管,一方的改动没了。
轮着处理,两样都好好生效。
同时来也先排个队,
一个做完了才接下一个。
只要定个顺序,覆盖就没了。
加上前面的捆绑和回滚,
如今同时写也不乱。
这三样凑齐,数据就
靠得住到能放心托付。

05

来理一理

归成一句话,是这样。
把要成对改的改动捆成一个整体。
要么全成,要么全不成。
中途出岔,就不留一半,
整个退回到开始前。这就是回滚。
几个人同时想改同一处,
就排队轮着办,挡住覆盖。
要么全做要么全不做、出岔就回滚、
同时也不乱。那就是事务。

依次点四个要点
从上往下依次点下面的要点

依次点要点回顾一下。(转账是一对 → 要么全做要么全不做 → 出岔就回滚 → 同时也不乱)

现在你知道了安全改数据的
一份靠得住的约定。
钱凭空消失的那道惊险的缝、
断电只剩一半的事故、
同时改而搅成一团的混乱,
都靠一个整体这一个想法解开了。
越是许多人一起用的系统,
这份约定就越发珍贵。
下回也接着一起来看
处理数据的智慧吧。

一句话总结事务是把几次改动当成一个整体来处理,让它们要么全成、要么全不成的办法。像转账那样扣和加是一对时,两件都完成了才真正生效。中途要是断电或哪里对不上,它不会只留一半,而是把整件事退回到之前的状态。这叫回滚。还有,几个人同时想改同一笔余额时,它一个一个轮着处理,让大家不会互相覆盖。一拥而上的乱局变成了排队办理。一句话: 要么全做要么全不做、出岔就回滚、同时也不乱。这三样就是事务。
数据
如果有帮助,请支持我们