一. 事务——启航

31 阅读3分钟

最开始听说事务(Transaction)这个词, 是在大学的数据库课上. 教我们数据库的是一位穿着时髦英文流利的女老师(之所以知道她英文流利, 是因为数据库这门课要求双语教学, 一会儿英语一会儿汉语, 常常听的我一脸懵逼), 用的教材是一本暗红色的, 厚厚的教材. 记得书里用了一个取钱的例子来介绍事务, 大概如下:

假设你在一个银行账户中有1000元, 现在要从账户中取出200元, 这个操作在数据库中通常涉及以下几个步骤:

  1. 查询账户余额: 系统查询到你的账户余额中有1000元
  2. 扣除金额: 从你的账户中扣除200元
  3. 将数据库中你的余额更新为800元

事务就是要保证, 这三个步骤要么全部成功, 要么全部回滚. 比如不允许经过步骤2之后, 系统突然崩溃, 导致余额仍显示1000, 但实际已经取走了200元, 这样的情况出现.

那么事务的定义就很容易理解了: 一个事务是一个由多个数据库操作组成的逻辑单元, 这些操作要么全部成功执行并提交, 要么在任一操作失败时撤销所有已执行的操作(回滚), 从而保证数据库在事务执行前后的状态一致

在明确了事务的定义之后, 再来看一下事务有哪些特性, 这也是课本上讲解事务的顺序, 每本讲解事务的教材都离不开事务的ACID四个特性. 这是IBM的研究人员, 特别是Jim Gray等人对事务的概念进行了深入研究之后, 提出的:

原子性(Atomicity): 事务要么全部执行, 要么全部不执行

一致性(Consistency): 事务执行前后, 数据库从一个一致的状态转换到另一个一致的状态

隔离性(Isolation): 多个事务同时执行时, 互不干扰, 事务的中间状态对其他事务不可见

持久性(Durability): 事务一旦提交, 其结果必须永久保存在数据库中

ACID四个属性最初的定义和体现是在IBM的System R数据库管理系统上. 这里可以再多提一下System R系统, 它是上世纪70年代由IBM研究人员开发的一个原型关系数据库管理系统, 奠定了现代关系数据库的基础, 包括SQL语言及以及事务管理的核心概念. 在System R之后, ACID特性成为了所有关系数据库的重要标准, 其中就包括了本次学习主要使用的数据库————mysql, 还包括Oracle, SQL Server, PostgreSQL等, 都实现了ACID特性, 以确保数据一致性和可靠性.

那么现在可以说事务必然包含ACID四个特性, 那么我们在关注事务时, 不管是数据库中的事务, 还是单机服务程序中的事务, 还是分布式程序中的事务, 我们都应该关注这四个特性, 关注不同架构下的事务是通过什么技术来实现事务的ACID特性的.

所以接下来的学习路线, 首先会关注mysql数据库, 是如何实现事务的ACID四个特性的.