并发控制

并发操作带来的数据不一致性有

  • 丢失修改

    两个事务读入同一数据

  • 不可重复读

    2次读取未用数据,前后不一致(为了检验)

  • 读“脏”数据

    事务A修改数据并写会DB后,事务B读取,事务A因某些原因回滚,事务B此时没意识到,则读取了“脏”数据

封锁协议

  • 一级锁协议

    事务T在修改数据R之前加X锁,直到事务结束,防止丢失修改

  • 二级锁协议

    一级锁协议基础上,事务T在读取数据R之前先加S锁,读完即可释放防止读脏数据

  • 三级锁协议

    一级锁协议基础上,事务T在读取数据R之前先对其加S锁,直到事务结束才释放防止不可重复读

隔离级别

  1. 读不提交(Read Uncommited, RU)

    事务不隔离,可能产生脏读,可以读取未提交记录,实际中不会使用

  2. 读提交(Read Commited, RC)

    仅读已提交数据,但可能产生不可重复读与幻读,因为在此隔离机制下,每条语句都会读取到已提交事务的更新,若两次查询之间有其他事务提交,将会导致查询结果不同,对于insert也无法保证,但这种隔离机制使用还是比较广泛的

  3. 可重复读(Repeatable Read, RR)

    限定了其他事务对当前事务的删改,从而保证反复读取同一条记录不会发生变动,但未禁止增操作,会发生幻读

  4. 串行化(Serializable)

    消除幻读、不可重复读、脏读,但是并发度下降

幻读与不可重复读的区别

两者都表现为两次读取的结果不一致。

首先,抓住重点,不可重复读重点在于update和delete,而幻读的重点在于insert

如果使用锁机制来实现这两种隔离级别,在可重复读中,该sql第一次读取到数据后,就将这些数据加锁,其它事务无法修改这些数据(只是这些),就可以实现可重复 读了。但这种方法却无法锁住insert的数据所以当事务A先前读取了数据,或者修改了全部数据,事务B还是可以insert数据提交,这时事务A就会 发现莫名其妙多了一条之前没有的数据,这就是幻读,不能通过行锁来避免!!!

死锁的诊断

超时法、等待图法(有环)

可串行化调度

类似java的指令重排序,在单线程里面指令重排但是结果一致,而此相当于对并发事务重排

两端锁协议

为了保证数据库的可串行化,在对数据进行读、写前,要申请并获得对该数据的封锁,但此时不能释放锁(扩展阶段);在释放一个封锁之后,事务不在申请和获得任何其他封锁(收缩阶段)

封锁的粒度

粒度越大,封锁的数据单元越少,并发度越小,系统开销也越小;反之则反

  • 显式封锁

    直接将锁加到数据对象上

  • 隐式封锁

    数据对象没有被独立加锁,而是其上级节点解锁而使该数据对象加上锁

一般地,对某个对象加锁,系统要检查数据对象上的显式锁有无冲突再检查隐式锁,还要检查下级节点的显式加锁是否与本事务的隐式加锁冲突,效率低。因而有了意向锁,系统则无需检查下一节点的显式加锁

意向锁

含义:如果对一个节点加意向锁,说明该节点的下层节点正在被加锁;对任一节点加锁时,必须先对它的上层节点加意向锁

分为3种:

  • IS

    若对一个数据对象加IS锁,表示它的后裔节点准备加S锁

  • IX

    若对一个数据对象加IX锁,表示它的后裔节点准备加X锁

  • SIX

    若对一个数据对象加SIX锁,表示对它加S锁,再加IX锁

意向锁兼容矩阵:(+表示兼容,-表示不兼容)

/ IS IX S X
IS + + + -
IX + + - -
S + - + -
X - - - -
  • S、X、IS、IX锁兼容性矩阵为什么是这样子呢?
  1. 意向锁之间彼此不会冲突,因为它们都只是“有意”,而不是真干,所以是可以兼容的。在加行锁之前,会使用意向锁判断是否冲突
  2. IX和X的关系等同于X和X之间的关系,为什么呢?因为事务获得了IX锁,接下来就有权利获取X锁,这样就会出现两个事务都获取X锁的情况,这和我们已知的X锁和X锁之间互斥是矛盾的;
  3. S和IS、X和IS、IX和IS也可以由此推导出来。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • 当一个系统访问量上来的时候,不只是数据库性能瓶颈问题了,数据库数据安全也会浮现,这时候合理使用数据库锁机制就显得异...
    JackFrost_fuzhu阅读 7,703评论 4 83
  • 如果数据库中的所有事务都是串行执行的,那么它非常容易成为整个应用的性能瓶颈,虽然说没法水平扩展的节点在最后都会成为...
    Rick617阅读 3,432评论 0 6
  • 首先区分交叉并发方式和同时并发方式。 8.1,并发控制概述 并发带来的三种数据不一致性:1,丢失修改;2,不可重复...
    LCM_一方阅读 260评论 0 0
  • 当一个系统访问量上来的时候,不只是数据库性能瓶颈问题了,数据库数据安全也会浮现,这时候合理使用数据库锁机制就显得异...
    初来的雨天阅读 3,549评论 0 22
  • 昨夜未消残酒, 白昼撷花轻嗅。 远道鹭鸶开, 方晓海棠消殆。 知了,知了, 藏在丛中欢叫。 注: 鹭鸶:此处的鹭鸶...
    萧慕雨阅读 526评论 16 9