数据库系统并发控制原理

数据库访问是通过事务完成的,首先我们搞清楚什么是事务?

被视为整体的一组工作

这组工作要么完全完成,要么全部不完成,不存在部分完成情况

真实生活中以转账说明事务:

第一步,从账户A中减去X元金额;

第二步,将X元金额存入账户B

这些多步操作必须全部完整完成,不能半途而废。数据库事务的工作方式与此相同。他们能保证,无论发生什么事情,数据的操作处理都被看成是原子的(你永远不会看到“转变一半”的情况)。

原子性是DBMS维护ACID属性的一部分,ACID包括:

Atomicity原子性: 事务中所有操作要么全部发生,要么全部不。

Consistency一致性: 数据库从一致状态开始到一致状态结束。

Isolation隔离性: 一个事务的执行是隔离于其他事务的。

Durability:如果事务已经确认提交,其效果是持久保存在数据库中。

那么在并发访问数据库的情况下会发生什么问题?并发流程可能会改变隔离性和一致性这两个属性。让我们假设两个用户预订了一架飞机的同一个座位:

客户1 发现一个空座位

客户2 发现同样的空座位

客户1预订了这个座位

客户2也同时预订了这个座位

我们将事务的顺序执行称为schedule调度,它表示基于时间先后的一系列事务执行,在这里客户1和客户2分别存在两个事务,这个两个事务同时发生,我们需要通过串行化serializability来保证事务正确执行,也就是说,需要通过一个调度来实现并发控制机制。

一个调度包含下面一些操作:

read R(X)

write W(X)

commit (所有操作完成后,这些操作应该被确认和记录)

abort (在执行一部分操作后,如果我们退出,所有操作应该没有一个被确认完成或记录保存)

为了有完整的调度,commit 或abort是被强制的。

serial schedule串行调度是事务执行时间没有交织,所有操作都是顺序执行。

当下面条件满足,Conflicting operation冲突操作会出现:

它们属于不同的事务

它们得访问同一的对象X

至少其中一个操作是W(X) (对X的写操作)

让我们看看下面这些冲突操作:

写读冲突 Write-Read Conflict: 读到一个未提交uncommitted的数据

读写冲突 Read-Write Conflict: 首次读以后,再读已经被修改的数据。

写写冲突 Write-Write Conflict:其中一个写操作丢失

Write-Read Conflict, 也称为reading uncommitted data读未提交的数据或脏都dirty-read,当一个事务T2试图读取数据库对象A,但是其已经被事务T1修改,还没有提交确认,当T1继续其事务时,对象A的数据已经不一致了,如下图:


换句话说,脏读是当一个事务读取了被另外一个事务修改但是还没有提交确认的表记录。

读写冲突Read-Write Conflict, 也称为unrepeatable reads, ,当一个事务T1读两次数据库对象A,第一读以后事务T1等待事务T2完成,T2覆盖重写了对象A,当T1再次读A时,A数据存在两个不同版本,T1被强迫退出,因为这是不可重复的读。


真实案例:Bob和Alice是票务员,他们要预订一个表演票,只剩余一张了,Alice登录进入,发现这周票比较贵,犹豫了一下,而Bob登录进入后,就立即买了这张票,然后退出。Alice决定买这张票时,发现已经没有多余的票了。

写写冲突Write-Write Conflict, 也称为覆盖未提交数据overwriting uncommitted data,它是发生在当有一个丢失修改情况下,试图使这种场景串行只能是下面两者之一:要么是事务T1版本,要么是事务T2的版本:

一旦并发事务应用到数据库上,使用调度确保串行化,也就是执行是顺序的,不会有时间的重叠,除了串行,还有以下几种调度方式:

ACA : 避免级联中断

可恢复性recoverable

严格调度strict schedule


如果一个调度是串行化的,最好的验证办法是通过依赖图。为了建立依赖图,我们需要下面过程:

1) 每个节点每个事务的代表

2)在事务Tx写入后还有另外的事务Ty读吗?如果是,从节点Tx画线到节点Ty

3)在事务Tx读取以后,是否有其他事务再进行写入呢?如果是,从Tx画线到Ty。

4)在Tx写入后有其他事务再次写入吗?如果是,从Tx画线到Ty。

如果退出事务,不要忘记移除你之前的画线。

为了偶一个串行化的调度,依赖图得是非循环的,也就是不能首尾循环依赖。比如下面的调度不是串行化:

而下面的调度是串行化的:

现在我们知道什么时候一个调度是 strict严格的?

当一个对象被事务T写入,那么一直到事务T确认提交或退出,这个对象就一直不能被再次读取或写入了。

那么一个调度如何避免级联退出呢?

当一个操作只能读取已经被提交确认的数据时,就可以避免级联一个个的事务退出。

那么如何知道一个调度是可恢复的?

对于每个事务,当事务Ty读取一些Tx事务的写入数据时,Tx的Commit提交操作出现在Ty的Commit提交操作之前。

总结

并发控制是通过串行化方式实现,这样能够确保任何非串行化的执行不会发生。当然主要问题是带来性能瓶颈。

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

推荐阅读更多精彩内容