暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
19从猫爷被杀说起 —— 事务简介(02).pdf
308
23页
14次
2022-03-14
免费下载
标签 MySQL 是怎样运⾏的
事务
对于⼤部分程序员来说,他们的任务就是把现实世界的业务场景映射
到数据库世界。⽐如银⾏为了存储⼈们的账户信息会建⽴⼀
account
CREATE TABLE account (
id INT NOT NULL AUTO_INCREMENT COMMENT '
id',
name VARCHAR(100) COMMENT '户名',
balance INT COMMENT '余额',
PRIMARY KEY (id)
) Engine=InnoDB CHARSET=utf8;
狗哥和猫爷是⼀对好基友,他们都到银⾏开⼀个账户,他们在现实世
界中拥有的资产就会体现在数据库世界的account表中。⽐如现
狗哥11元,猫爷只有2元,那么现实中的这个情况映射到数据库
account表就是这样:
+----+--------+---------+
| id | name | balance |
+----+--------+---------+
| 1 | 狗哥 | 11 |
| 2 | 猫爷 | 2 |
+----+--------+---------+
在某个特定的时刻,狗哥猫爷这些家伙在银⾏所拥有的资产是⼀个特
定的值,这些特定的值也可以被描述为账户在这个特定的时刻现实世
界的⼀个状态。随着时间的流逝,狗哥和猫爷可能陆续进⾏向账户中
存钱、取钱或者向别⼈转账等操作,这样他们账户中的余额就可能发
⽣变动,每⼀个操作都相当于现实世界中账户的⼀次状态转数据
库世界作为现实世界的⼀个映射,⾃然也要进⾏相应的变动。不变不
知道,⼀变吓⼀跳,现实世界中⼀些看似很简单的状态转换,映射到
数据库世界却不是那么容易的。⽐⽅说有⼀次猫爷在赌场赌博输
钱,急忙打电话给狗哥要借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链表中,在之后的某个时间点才会刷新到磁盘。如果在将修
过的⻚刷新到磁盘之前系统崩溃了那岂不是猫爷还是要被砍死?或者
在刷新磁盘的过程中(只刷新部分数据到磁盘上)系统奔溃了猫爷也
会被砍死
怎么才能保证让可怜的猫爷不被砍死呢?其实再仔细想想,我们只是
某些数据库操作符合现实世界中状态转换的规已,设计数据
库的⼤叔们仔细盘算了盘算,现实世界中状态转换的规则有好⼏条,
待我们慢慢道来。
of 23
免费下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜