在某个特定的时刻,狗哥猫爷这些家伙在银⾏所拥有的资产是⼀个特
定的值,这些特定的值也可以被描述为账户在这个特定的时刻现实世
界的⼀个状态。随着时间的流逝,狗哥和猫爷可能陆续进⾏向账户中
存钱、取钱或者向别⼈转账等操作,这样他们账户中的余额就可能发
⽣变动,每⼀个操作都相当于现实世界中账户的⼀次状态转换。数据
库世界作为现实世界的⼀个映射,⾃然也要进⾏相应的变动。不变不
知道,⼀变吓⼀跳,现实世界中⼀些看似很简单的状态转换,映射到
数据库世界却不是那么容易的。⽐⽅说有⼀次猫爷在赌场赌博输了
钱,急忙打电话给狗哥要借10块钱,不然那些看场⼦的就会把⾃⼰
剁了。现实世界中的狗哥⾛向了ATM机,输⼊了猫爷的账号以及10
元的转账⾦额,然后按下确认,狗哥就拔卡⾛⼈了。对于数据库世界
来说,相当于执⾏了下边这两条语句:
UPDATE account SET balance = balance - 10 WHERE
id = 1;
UPDATE account SET balance = balance + 10 WHERE
id = 2;
但是这⾥头有个问题,上述两条语句只执⾏了⼀条时忽然服务器断电
了咋办?把狗哥的钱扣了,但是没给猫爷转过去,那猫爷还是逃脱不
了被砍死的噩运~ 即使对于单独的⼀条语句,我们前边唠叨Buffer
Pool时也说过,在对某个⻚⾯进⾏读写访问时,都会先把这个⻚⾯
加载到Buffer Pool中,之后如果修改了某个⻚⾯,也不会⽴即把
修改同步到磁盘,⽽只是把这个修改了的⻚⾯加到Buffer Pool的
flush链表中,在之后的某个时间点才会刷新到磁盘。如果在将修改
过的⻚刷新到磁盘之前系统崩溃了那岂不是猫爷还是要被砍死?或者
在刷新磁盘的过程中(只刷新部分数据到磁盘上)系统奔溃了猫爷也
会被砍死?
怎么才能保证让可怜的猫爷不被砍死呢?其实再仔细想想,我们只是
想让某些数据库操作符合现实世界中状态转换的规则⽽已,设计数据
库的⼤叔们仔细盘算了盘算,现实世界中状态转换的规则有好⼏条,
待我们慢慢道来。
文档被以下合辑收录
评论