先建个表方便理解
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就知道是这四个规则的意思。
交易在执行的过程中,有以下状态:
活动的
交易对应的资料库操作正在执行中
部分提交的
当最後一个操作执行完成,最新的资料还在记忆体中,并没有刷新到磁碟,这个状态就是部分提交的
失败的
遇到某些错误
中止的
当资料库操作失败後,资料会回覆操作(回到资料变更前一开始的状态),这时就会变成中止的状态
提交的
当部分操作的资料刷新回磁碟即为提交。
前几天的打底, 把 Gitlab、Jenkins 建好, 但是仍然少了最重要的主角, 要部署的服务本...
前言 经过前面几篇基础介绍,应该对 useState 与 useEffect 有一定程度的认识,俗话...
使用地图区块,可将地图嵌入网站上的任何文章或页面之内。 若要新增地图区块,请按一下区块插入工具图示。...
Uart 是什麽? UART(Universal Asynchronous Receiver/Tra...
WebPC 是我刚在 github 上开源(MIT)的一个远控工具,可以作爲 TeamViewer ...