这是我参与「第三届青训营-后端场」笔记创作活动的的第6篇笔记
RDBMS
关联式数据库系统(Relational Database Management System)一般将资料储存在有固定栏位的资料表架构里(Schema),资料与资料之间可以建立关联,并透过结构化查询语言(Structured Query Language,简称 SQL)来与数据库互动,也可以在不同的资料表中交互查询。MySQL 和 PostgreSQL 都是属于关联式数据库。
Transaction
Transaction 可以视为一组对数据库的读写操作,例如交易、转帐等。举例来说,小明在网络上卖一本《前端秘籍》,若小花下单了,小明卖场的书就减少一本而归零,而小花就获得了一本书,这就是一个 transaction。
Lock
但如果今天小花和小王同时下单了这本《前端秘籍》,就可能会发生超卖的情形,一本书卖给了两个人,这种情况称为 race condition。为了确保 transaction 不会发生 race condition,也就是确保买卖数量的正确性,我们可以建立一个标记,这个标记的用途是当这本书被第一个买家买的时候,告知其它准备买这本书的买家,这本书正在被卖哦,其它买家就要等待该买家买完之后,才可已执行动作,当然,因为只有一本,所以第一个买家买完了,之后的人就不能再买了。
回到数据库的场景来说,为了确保多笔 transaction 在资料读取和写入的时候不会互相影响的隔离性(isolation),进而达到资料的一致性(concurrency),我们可以在资料读取或写入时做上一个记号,其它 transaction 就要根据这个记号来决定是否要等待该记录状态结束或是直接读取资料,而这个记号就是数据库中的 lock。
ACID
ACID 则是为了保证 transaction 是正确可靠的,所必须符合的四个特性:
· 原子性(Atomicity):一个 transaction 中的所有操作,或者全部失败,或者全不成功,不会有部份成功或失败的情况发生。意即不可分割的零和关系。
· 一致性(Consistency):在 transaction 的开始之前和结束以后,都要遵循数据库事先定义好的规则,以维持资料的一致性。
· 隔离性(Isolation):任何的 transaction 都不会影响另一笔 transaction,确保多笔 transaction 同时执行时不会因为互相影响而导致资料不一致。
· transaction 成功之后,对于数据库的修改是永久的,即使系统故障也不会遗失。
小结
关联式数据库的优点是简单、稳定且社群支援度高,是目前被广泛使用的数据库类型,对资料容忍度低的服务,例如转帐、交易等,因为关联式数据库透过 ACID 确保 transaction 是正确可靠的,是很好的选择。