《Designing Data-Intensive Applications》第7章 读书笔记(1):事务的基础介绍

1.说明

事务,是一个把若干读写放入同一个逻辑单元的方式。
概念上,事务的读写要么全成功(commit),要么全失败(abort,rollback)。即使失败,程序也能安全的重试。
有了事务,处理错误会变得很简单,因为不用担心部分错误的问题。
有了事务,db也会有安全保障,应用程序可以忽视特定的错误场景以及并发的问题。

实际上,不是所有应用都需要事务,那么怎么知道自己需不需要事务,这就要理解事务能够提供的安全保证以及对应的代价。下面看一系列问题,如并发控制,多种竞争的触发以及db实现的隔离级别

2.概念

如今几乎所有的关系db以及部分非关系db都支持事务
部分非关系db默认提供分区,备份的支持,而这种场景下,事务则成了受害者。这些新生代的db放弃了食物或者提供了非常弱的保证。

如今关于分布式db以及事务的关系,有两种观点

第一种观点是事务制约了拓展性,任何大型系统应该抛弃事务来保证高可用性以及效率。
另一种观点认为,db必须提供事务的保证,完成对“有价值数据”的某些处理。
两种观点都夸张了。

实际上,所有技术选型都有优势以及制约,稍后会深入细节讲解事务的trade-off.

2.1 ACID

事务提供的安全保证,常称为ACID,即原子性,隔离性,一致性,持久性。这是1983年Andreas Reuter和 Theo H?rder提出的。
然而,不同db对他们的实现各不一样,甚至对于I(隔离性)都有不同的理解。
不幸的是,ACID几乎成了一个市场用语。

Atomicity

广义来说,原子性表示一个东西不能够拆解的更细了。
在事务中,原子性表示:

所有事务的所有操作要么都成功,要么都失败。
不会因为某些原因(断电,网络中断)等原因造成数据处于部分成功,部分失败的状态。
这使得失败的事务可以进行重试,而不会使得数据出现duplicate或者错误。

Consistency

一致性这个词到处都在用

备份一致性(如最终一致性)
一致性hash
CAP理论(后续第9章再介绍)

然而在事务中,一致性表示:

在应用的层面上,数据处于一个正确的状态
ACID中,AID其实都是db的特性。然而C(一致性),是一个应用程序的性质
应用程序需要db的原子性和隔离性,来达到应用程序的一致性

比如一个会计系统,数据要保证收支平衡。这是程序自己保证的。
如果程序自己写入收支不平衡的错误数据,db并不能阻止。

Isolation

多个client同时访问db的同一份数据时,会出现并发竞争问题。
如下图实例,两个client获取当前值并进行+1操作


图1

由于出现了竞争,数据本该从42变成44,结果变成了43

隔离,表示同时执行的事务之间互不干扰。
db保证并发执行的事务的结果要和他们串行执行的结果一样.

实现中,串行化的隔离基本不用,因为代价很高。有些db如Oracle中会用快照隔离,是比串行化隔离弱一点的隔离级别,后面会讲

Durability

持久性是一个承诺,一旦事务成功提交,它所写的任何数据将不会丢失,即使有硬件故障或数据库崩溃。
在单节点数据库中,持久性通常意味着数据已写入非易失性存储(如硬盘驱动器或SSD)。它通?;剐枰慈肴罩?,以便出现文件损坏时恢复工作。
在分布式数据库中,持久性可能意味着数据已成功复制到一些节点上。

当然,完美的持久性是不存在的,比如所有备份,硬盘同时被损坏。

2.2 单obj以及多obj的操作

ACID中的AI描述了一个事务中包含多个写时,db应该处理的事情

原子:提供要么全成功要么全失败的保证,不会出现中间状态
隔离:并发执行的事务互不影响,一个事务要么看到另一个事务的所有写,要么看不到任何写

上述定义假定多个事务在同时修改多个obj(记录)

下图以收发邮件为例,查找收件人未读的邮件,以及从邮箱中查找未读邮件的个数

图2,user2看到了user1的未提交的写

上图违背了事务的隔离性,是不满足ACID要求的。称之为脏读

多对象的事务请求 要求有一种方式决定哪些读写属于同一个请求,这可以通过client的tcp链接知道
在BEGIN TRANSACTION以及COMMIT之间的语句都被认为是同一个事务

很多非关系型db对于原子性支持不好(即使有multi operation)
会存在部分数据更新成功但是部分数据失败的情况

单obj的写

原子性能够用崩?;指慈罩臼迪?隔离性能用对象锁实现

有些db提供复杂的原子操作,利用自增操作解决图1中的read-modify-write的问题
类似的是CAS操作,即compare and set,这里不展开

这些操作十分有用,能够阻止多个client同时写一个obj时出现的lost updates问题,后面会介绍

对于 多obj的写 的需求

现状:
很多分布式存储放弃了多obj的事务,因为在分区中太难实现了,另外还会影响性能。

是否需要多obj的写:
很多场景单object操作就够了,但是也有场景要处理多object,即外键,二级索引等等。
这些场景当然也可以不用事务实现,但是缺乏了原子性和隔离性会有下述后果
缺乏原子性,错误处理变得更复杂。
缺乏隔离性,会出现并发问题。下一节会介绍Weak Isolation levels。

2.3 处理错误以及丢弃错误

事务的特性决定了 它不会出现执行了一半的情况。

现状:
不是所有系统遵从这个规矩,比如在无leader模型中,会尽量执行,如果遇到了错误他们也不会回滚,由应用程序自行从错误中恢复。
错误最终会发生,但是很多开发缺盲目乐观,忽视了对于错误的错综复杂的处理。

如何处理:
事务出错之后,重试是一种简单有效的方法,但是并不完美

1.执行成功但是网络原因导致重试,会执行两次
2.如果负载压力过大,重试会加重负载
3.短暂的错误之后重试才有用(如死锁,网络中断等),永久的错误是不值得重试的
4.如果事务对db以外的部分有影响,如发送邮件,这个影响可能会持续,即使事务已经被丢弃了
5.如果client重试失败了,所有写的数据都会丢失

名词总结

主要涉及名词如下,在本章内容都会有详细介绍

ACID

快照隔离
脏读

read-modify-write
lost updates
Weak Isolation levels

思考

无leader模式是不支持事务的:
因为无法回滚,保证不了原子性

图1的例子中,两个事务之间怎么就互相干扰了呢?
可以理解为,第一个事务开始执行却还没有commit时,第二个事务也处于了同样的状态。
出现了race condition

错误的解决方式是重试,重试的代价如何
文章上面有写

总结

本章介绍了事务以及ACID的定义
对于单obj以及多obj的操作,现状进行了一定的展开
对于错误处理以及重试的代价进行了分析

暂时不知道的问题

是否有分布式事务
事务和分区,备份是怎样的结合,能全部结合还是部分结合
zk的multi op与事务的关系,以及支持

refer

http://08643.cn/p/a84e4f41a2aa

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容