第七章 并发控制

之前我们讨论了单一的TX的恢复。一份数据多个备份怎么保证CONSISTENCY,对多个变量一系列操作放在一个TX会如何?

那么有多个并行的TX会如何呢?
你写的东西被别人看见,但是别人用了你的写,你却回滚了。这就会有问题。
如果不对CONCURRENT TX管理的话,系统会出现各种问题, 和DATA RACE 在parallel program 很相似。

一个问题,你能多提取500块


image.png

你可以让APPLICATION 来保护,比如去拿锁。 但是这会增加APPLICATION DEVELOPER 的负担,造成重复开发,你的APP 和别人的APP会造成相同的数据块的,这样只拿自己内存里的锁是没法保证的没有DATA RACE的。

如果给STORAGE来做,那么APP就很简单,上面什么都不用太考虑。

image.png

今天我们来讲ISOLATION,因为其他三个上一章已经搞定了。

image.png

SERIALIZABILITY
2个TX并行执行,执行完的结果,等同于这2个TX串行的执行的结果。

image.png

上面2个TX 并行执行 的效果 和串行是等价的,所以他们并行执行没有问题。

image.png

下面这种调度的方式就会有问题

image.png

下面有2种SOLUTION,一种就是在TX这完全加锁,这个是可以的,但是太慢。
另外一种是用一种细粒度的锁。在OBJECT LEVEL。但是依然不是SERILIZABLE,看下图。

image.png

这个是读未提交的问题。

那么我们是不是可以让写锁的时间变长一直到COMMIT,才放锁来解决这个问题。这个时候读锁还是立即释放的锁。这样会出现另外一种不SERIALIZABLE情况。


image.png

这个问题是不可重复读,就是在一个TX里面,读一个OBJ读2次结果不一样。
所以对READ来说,SHORT DURATION 也不行,也要变成LONG duration。
这个比第一种GLOBAL 好的,是细粒度的锁的实现。
还可以用读写锁来优化。

二阶段锁定,第一个阶段是GROWING,(集合会慢慢变大);第二个阶段,SHRINKING(发生在COMMIT的时候,只会收缩)


image.png

image.png

上面这种情况是不可能实现的,因为红色的A 的READ,读锁拿不到。

拿不到锁的时候,可以等,可以ABORT。
如果是等的话,就会出现DEADLOCK。避免DEADLOCK,可以使用按照一定的顺序去拿锁。
如果是看到1个变量拿一把锁,是没法实现的。除非在一开始你就知道要锁哪些变量。
我们可以去检查DEADLOCK,发现DEADLOCK,把其中一个ABORT。
1.通过分析拿锁过程是否有环。
2.我检查TIMEOUT,很长时间拿不到就ABORT自己。(你的TX比较久,就会没法执行完就ABORT自己;轮流拿锁轮流ABORT自己,就会有活锁的情况)

因为TWO PHASE LOCK 锁在OBJECT上,但会有在一个LIST 加2个新的ITEM,这2个OBEJCT 锁是不冲突的。概括的说,在查2次集合的时候,2次的ITEMS 数目不一样。一个会比另一个多。

问题就在于把LOCK放在OBJECT上,在上述情况中,应该把这个锁加在搜索的集合上。


image.png

用谓词锁,或者间隙锁(B树上锁一个子树(RANGE))
在实际中,默认不采用SERIALZABLE,因为性能会不好。一个分析的SQL,就会是一个很长的READ ONLY的TX(比如分析1个小时)那么在这个TX,其他的TX会被挡住,所以造成别的功能就挂了。

image.png

所以我们需要在一个SERIALZABLE 上的一个优化。突破的方式在一个TRADE OFF的变化。
比如要更好的性能,要牺牲一些CONSISTENCY上的保证。
这就提出了一个MVCC的CONTROL


image.png

把所有写操作BUFFER起来(因为不知道最后是COMMIT,还是ABORT,还不希望读到未提交的写),读的时候要选合适的版本。在提交时,系统会验证是不是可以让读VISIBILE。(乐观锁,如果发生了CONFILICT,就产生新的版本)

image.png
image.png

如果在COMMIT的时候,看写X的时间,如果BUFFER SET里有个新的TX提交的X写,就会ABORT。

下面再看一个例子。


image.png
image.png

上面的方案 等价的SERIAL 的 顺序如下图


image.png

但也是有个反例的。


image.png

但是幻读的问题解决了。

如果隐含的条件不在TX里可以表达,那么无论是TWO PHASE LOCK 还是MVCC都不能实现。

上述都是在一台机器上的并发事务。

如果在2台机器上要保持事务,多台机器要达成一致,应该怎么做呢?
1。要所有人都同意
2。如何处理有的人挂了

2 phase commit - > paxos

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

推荐阅读更多精彩内容