数据密集型应用DDIA 读书笔记

9 阅读3分钟

在线阅读地址:ddia.vonng.com/#/

  1. 第七章:事务

  1. 事务的棘手概念

什么是事务?

事务是应用程序将多个读写操作组合成一个逻辑单元的一种方式。从概念上讲,事务中的所有读写操作被视为单个操作来执行:整个事务要么成功提交,要么失败终止或回滚。如果失败,应用程序可以安全的重试。

为什么需要事务

  • 数据系统中很多事情都可能错误

    • 数据库软件、硬件可能在任意时刻发生故障(包括写操作进行到一半时)
    • 多个客户端可能会同时写入数据库,覆盖彼此的更改。
  • 通过使用事务,应用程序的错误处理变得简单多了,因为它不用再担心部分失败的情况了,即某些操作成功,某些失败(无论出于何种原因)

事务的缺点:一定程度上影响了系统的高性能或更高可用

事务的4大特性:ACID

  • 原子性(Atomicity),更合适应该为Abortabilty
  • 一致性(Consistency)
  • 隔离性(Isolation)
  • 持久性(Durability)
  • 它由 Theo Härder 和 Andreas Reuter 于 1983 年提出,旨在为数据库中的容错机制建立精确的术语。
  • 实际上,不同数据库的 ACID 实现并不相同。例如,关于 隔离性的含义就有许多含糊不清。不幸的是,ACID 现在几乎已经变成了一个营销术语。

原子性:

  • 什么是原子性:能够在错误时中止事务,丢弃该事务进行的所有写入变更的能力。 或许可中止性(abortability) 是更好的术语,但本书将继续使用原子性,因为这是惯用词。

书中对原子性的解释非常好,从下面的解释可以看出ACID的原子性其实和我们应用开发里面的多线程原子操作概念并不同。数据库中的原子性是指如果事务被终止,则事务终止之前所做的所有操作必须可以全部取消。ACID中的A如果使用abortability反而比atomicity 更合适。

  • 一般来说,原子是指不能分解成小部分的东西。这个词在计算机的不同领域中意味着相似但又微妙不同的东西。例如,在多线程编程中,如果一个线程执行一个原子操作,这意味着另一个线程无法看到该操作的一半结果系统只能处于操作之前或操作之后的状态,而不是介于两者之间的状态。

  • 相比之下,ACID 的原子性并不是关于 并发(concurrent) 的。它并不是在描述如果几个进程试图同时访问相同的数据会发生什么情况,这种情况包含在缩写 I 中,即 隔离性

  • ACID 的原子性描述了当客户想进行多次写入,但在一些写操作处理完之后出现故障的情况。例如进程崩溃,网络连接中断,磁盘变满或者某种完整性约束被违反。如果这些写操作被分组到一个原子事务中,并且该事务由于错误而不能完成(提交),则该事务将被中止,并且****数据库必须丢弃或撤消该事务中迄今为止所做的任何写入

  • 如果没有原子性,在多处更改进行到一半时发生错误,很难知道哪些更改已经生效,哪些没有生效。该应用程序可以再试一次,但冒着进行两次相同变更的风险,可能会导致数据重复或错误的数据。原子性简化了这个问题:如果事务被 中止(abort),应用程序可以确定它没有改变任何东西,所以可以安全地重试。

一致性: