小蛙借钱给你的交易概念!!

先建个表方便理解

mysql> 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;
Query OK, 0 rows affected, 1 warning (0.45 sec)

mysql> insert account (name, balance) values ('小蛙', 1000000), ('你', 0);
Query OK, 2 rows affected (0.15 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from account;
+----+--------+---------+
| id | name   | balance |
+----+--------+---------+
|  1 | 小蛙   | 1000000 |
|  2 | 你     |       0 |
+----+--------+---------+
2 rows in set (0.01 sec)

假设你要跟小蛙借10块钱
执行的叙述可能是这样

update account set balance = balance - 10 where id = 1;
update account set balance = balance + 10 where id = 2;

先从小蛙的帐户扣10块,再转到你的帐户。
但如果扣了钱之後,系统crash,导致你没收到钱,那双方不就傻爆眼了@o@

因此可发现一个简单的现实交易行为,要在资料库实现没有那麽单纯的
这边就要提到交易机制的四大特性,来确保交易机制没有问题!

四大特性

原子性
现实世界转帐是一个不可分割的操作,也就是要嘛转帐成功,要嘛失败,没有转一半的情况
也就是说要嘛全做,要嘛全不做,这个规则就称为原子性。

隔离性
在现实世界中,从小蛙的帐户扣10块,再转到你的帐户,这两个状态是不会互相影响的。
但在资料库里面要实现却没有这麽单纯,因为执行操作的过程有可能是异步的,表示有可能不会确定从小蛙的帐户扣10块之後,再转到你的帐户,因此多了一个机制确保交易变更状态彼此不会互相影响,这个规则就称为隔离性。

一致性
顾名思义就是致力於维持资料库内的资料一致性。

持久性
表示所有保存在磁碟的变更资料,无论之後发生了什麽事都应该永久保存。

交易的概念

需要保证原子性(Atomicity)、隔离性(Isolation)、一致性(Consistency)、持久性(Durability)的或多个资料库操作就是交易。而将这四个单字的字首取出来就是A、I、C、D,稍微变化一下顺序形成一个完整的单字ACID(酸的意思),以後提到ACID就知道是这四个规则的意思。

交易在执行的过程中,有以下状态:
活动的
交易对应的资料库操作正在执行中

部分提交的
当最後一个操作执行完成,最新的资料还在记忆体中,并没有刷新到磁碟,这个状态就是部分提交的

失败的
遇到某些错误

中止的
当资料库操作失败後,资料会回覆操作(回到资料变更前一开始的状态),这时就会变成中止的状态

提交的
当部分操作的资料刷新回磁碟即为提交。


<<:  找资安工作,怎麽找?要学甚麽?该何去何从?

>>:  Powershell 入门参数属性(2)

EP09 - 建立 Django 专案和 EC2 环境 并手动部署到 EC2

前几天的打底, 把 Gitlab、Jenkins 建好, 但是仍然少了最重要的主角, 要部署的服务本...

Re: 新手让网页 act 起来: Day15 - 探索 useState (1)

前言 经过前面几篇基础介绍,应该对 useState 与 useEffect 有一定程度的认识,俗话...

16 | WordPress 地图区块 Map Block

使用地图区块,可将地图嵌入网站上的任何文章或页面之内。 若要新增地图区块,请按一下区块插入工具图示。...

【Day17】Uart_TX 状态机的实现

Uart 是什麽? UART(Universal Asynchronous Receiver/Tra...

开源的WebPC让你使用浏览器远程控制 linux or windows

WebPC 是我刚在 github 上开源(MIT)的一个远控工具,可以作爲 TeamViewer ...