Transactions (1) - ACID

此系列是 资料工程师修炼之路 的後半部份,一样是 Design Data Intensive Applications 的摘要 + 经验分享,所有的图片都是节录该书内容。


在莫非定律的魔爪下,一个应用系统都有可能遇到下列几种错误:

  • 资料库的软件或硬体忽然挂掉。
  • 应用系统端(Application)忽然挂掉。
  • 系统跟资料库的网路断掉,或者各资料库节点的网路断掉。
  • 同时多个客户端想修改资料库资料。
  • 某个客户端读取到奇怪的资料,因为该资料是部份更新成功。

transaction (事务) 的概念就是让上述问题 简单化,transaction 就是一个方法让应用系统把数个读取和写入集结成一个逻辑单位,白话点说就是同一个 transcation 的多次读取跟写入会视为一个操作,就只有成功 (commit) 或失败 (abort, rollback) 两种结果;若发生失败,有关资料是否更新的疑虑通通消失,你的後续动作就变的简单多了。

几乎所有的关联式资料库 + 少部份的 NoSQL 支援 transaction,就像所有技术决定一样,transaction 有它的优点跟限制,并不是所有的应用系统都需要 transaction,也不是用了 transaction 就一定比较慢,更没有 transaction 非得用在 有价值 的资料上,所以在做各种权衡前,务必要了解各种 transaction 的概念与机制。

ACID

transaction 的安全保证来自 原子性 (Atomicity)一致性 (Consistency)隔离性 (Isolation)持久性 (Durability),由 1983 年的 Theo Härder 和 Andreas Reuter 提出,但时至今日,ACID 这词变的很暧昧,同样的词可能会代表不同意思,接下来会详述 ACID 通用的定义和该改什麽名词比较好 XD

原子性 (Atomicity)

一般来说,原子性 意为某样东西不可在被切割的更小块。

但在计算机领域中,则是指在多执行绪底下,某个执行绪若执行一个原子操作 (atomic operation),另一个执行绪无法看到该操作中的半完成状态,只有操作前跟操作後两个状态。

就 ACID 的角度来看,原子性跟并发 (concurrent) 一点关系都没有(跟并发有关的是 隔离性),原子性描述的是当多次写入有错误发生时(无法 commit,且有几笔已成功写入),transaction 会中断,资料库会舍弃或回复成原始的资料,应用系统端可以确保不会有任何资料被写入,所以他们可以放心的重试。

书中就说,用中断性 (Abortability) 来代表 A 会比较适合。

一致性 (Consistency)

这个的定义可多了,简单举例就有:

ACID 的 一致性 指的是在你对你资料的某种陈述底下,其资料必定符合该陈述。

什麽意思呢?假设有个会计系统,你的资料中有借就会有贷,借贷必定平衡,所以一个 transaction 成功时,其必定满足这个陈述。

然而,这个 一致性 的概念是需要仰赖应用系统来定义的,其实跟资料库要提供的 transaction 安全保证没啥关系,你若想写脏资料,资料库也管不到你,所以啦,资料库其实只需要 原子性隔离性持久性 就能确保应用系统端想符合的一致性。

隔离性 (Isolation)

隔离性 指的是当 transaction 在并发执行时,其 transaction 不会互相影响。

下图 7-1 是个例子来说明对同一笔资料的并发操作问题,你有 2 个 User 同时去将 counter + 1,最终的 counter 应该要 44, 而不是 43。

教科书等级的隔离 是 序列化隔离 (serializability isolation),意思是每次在资料库中,只会有一个 transaction 在执行,做完才换下一个,但实务上不会这样干,对效能的影响很大,大多都会使用较弱的 弱等级的隔离 (Weak Isolation Levels)Day 3, 4 介绍)。

持久性 (Durability)

持久性 是保证一但 transaction 成功 commit,资料不会被忘记,即使硬体坏掉或资料库挂掉。

对单机器的资料来说,持久性 就是成功写到硬碟或 SSD 上,对多节点有 数据复制 (replication) 的资料库来说,持久性 就代表了有成功复制资料到其他节点上了。


明天会谈谈资料物件之更新会用到哪些 ACID 原则。


<<:  [Day 1] 前言-为甚麽要探索?

>>:  [Day 1] Google Data Analytics Professional Certificate 介绍

[Day10]PHP判断式03

PHP判断式 return return 将程序控制返还给调用模块。将在调用模块中执行的下一句表达式...

【Day 10】分类(Classification)(上)

找一个function,其输入为 ,输出为 属於哪一个class。 范例应用 找一个输入是某一只宝...

[Day 02] Why MLOps — 从"地平说" 走向宇宙

Machine learning is now a product engineering dis...

Day17-Goroutine

前言 goroutine 是 Go 语言实现并发的一种方式,在执行的过程需要少量的记忆体用量(4k~...

[Day10] 聊聊 Config

Config 的用途 Config 内放的是对整个网站的控制项,从一些 Hugo 或是主题的模板中也...