首先锁是用来做互斥的,解决并发执行时的数据不一致问题

如图会导致,不可重复读

如果这里用lock就可以解决,数据库里面有个LockManager来作为master,负责锁的记录和授权

数据库里面的基本的锁类型,

其实就是读锁,写锁

但是如果光是有读写锁,只能解决当个操作互斥和正确,无法解决transaction的正确

所以我们需要一个事务级别的锁,就是2PL,两阶段提交

最核心的想法,在growing阶段需要拿到所有需要的锁,否则就会block;shrinking阶段,不能去增加锁,只能释放锁

2PL在shrinking阶段是可以逐个去释放锁的,这样会有cascding aborts问题

因为你释放部分锁的时候,其他的事务就会看到你的改动,但最终你abort,那么所有相关的事务由于脏读也必须要abort

2PL有如下的问题,

首先,2PL是充分不必要条件,不满足2PL并不一定会导致调度问题,所以2PL限制了并发

第二,由于脏读导致的Cascding abort,这个的解决很直接,Strict 2PL,Shrinking阶段不会逐步释放锁,最后一起释放,这样就不会脏读了,这个方法会进一步限制并发,谈不上优雅

下面看一组例子,

非2PL,读到的是A,B的中间结果,所以会发生不一致;2PL,解决了不一致问题;Strict 2PL,明显进一步限制了并发,几乎就是顺序执行

事务还有一个问题,死锁

死锁就是发生锁环了,两种解决方法,

Detection和Prevention,detection就是检测有没有环,如果有环就处理;Prevention就是预先判断是不是会形成环,如果会就拒绝请求

死锁Detection,生成waits-for图,如果有环,就说明有死锁

出现死锁,解决从策略就是挑一个进行重启或abort

挑选的策略就是代价更低,然后挑出合适的victim后,就是要进行处理

处理的时候,可以分为完全Rollback和部分Rollback,因为有时候Rollback到不持有这锁就可以解决死锁的问题,不用完全的rollback

prevention的策略如下,prevention的依据就是时间,要不新的等,要不老的等

锁粒度

对数据库加锁可以在各个粒度上,

在树上任一节点加锁,意味着对所有子节点也持有锁

意向锁,intention lock

比如你在要给table加锁的时候,你先要确认table底下的所有tuple,attr是否有锁,这样很低效

所以意向锁就是一个flag,标识子节点上是否有锁

意向锁分为几类,

读写意向锁,很好理解,就是表示子节点是否有读写锁

SIX,Shared Intention Exclusive,首先加Shared锁,这样可以扫描全表,然后加IX锁,需要更改其中某些tuple

例子,

CMU Database Systems - Two-phase Locking的更多相关文章

  1. CMU Database Systems - Timestamp Ordering Concurrency Control

    2PL是悲观锁,Pessimistic,这章讲乐观锁,Optimistic,单机的,非分布式的 Timestamp Ordering,以时间为序,这个是非常自然的想法,按每个transaction的时 ...

  2. CMU Database Systems - Database Recovery

    数据库数据丢失的典型场景如下, 数据commit后,还没有来得及flush到disk,这时候crash就会丢失数据 当然这只是fail的一种情况,DataBase Recovery要讨论的是,在各种f ...

  3. CMU Database Systems - Concurrency Control Theory

    并发控制是数据库理论里面最难的课题之一 并发控制首先了解一下事务,transaction 定义如下, 其实transaction关键是,要满足ACID属性, 左边的正式的定义,由于的intuitive ...

  4. CMU Database Systems - Storage and BufferPool

    Database Storage 存储分为volatile和non-volatile,越快的越贵越小 那么所以要解决的第一个问题就是,如果尽量在有限的成本下,让读写更快些 意思就是,尽量读写volat ...

  5. CMU Database Systems - Distributed OLTP & OLAP

    OLTP scale-up和scale-out scale-up会有上限,无法不断up,而且相对而言,up升级会比较麻烦,所以大数据,云计算需要scale-out scale-out,就是分布式数据库 ...

  6. CMU Database Systems - MVCC

    MVCC是一种用空间来换取更高的并发度的技术 对同一个对象不去update,而且记录下每一次的不同版本的值 存在不会消失,新值并不能抹杀原先的存在 所以update操作并不是对世界的真实反映,这是一种 ...

  7. CMU Database Systems - Embedded Database Logic

    正常应用和数据库交互的过程是这样的, 其实我们也可以把部分应用逻辑放到DB端去执行,来提升效率 User-defined Function Stored Procedures Triggers Cha ...

  8. CMU Database Systems - Parallel Execution

    并发执行,主要为了增大吞吐,降低延迟,提高数据库的可用性 先区分一组概念,parallel和distributed的区别 总的来说,parallel是指在物理上很近的节点,比如本机的多个线程或进程,不 ...

  9. CMU Database Systems - Query Optimization

    查询优化应该是数据库领域最难的topic 当前查询优化,主要有两种思路, Rules-based,基于先验知识,用if-else把优化逻辑写死 Cost-based,试图去评估各个查询计划的cost, ...

随机推荐

  1. not syncing : corrupted stack end detected inside scheduler

    自己在测试安装UBuntu的时候遇见了这个错误,not syncing : corrupted stack end detected inside scheduler解决办法 原因是低版本的VMwar ...

  2. 杂项:MySQL

    ylbtech-杂项:MySQL 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部 0. https://www.mysql.com/ 1. https://bai ...

  3. POJ 2452 Sticks Problem (暴力或者rmq+二分)

    题意:给你一组数a[n],求满足a[i] < a[k] < a[j] (i <= k <= j)的最大的 j - i . 析:在比赛时,我是暴力做的,虽然错了好多次,后来说理解 ...

  4. render same axis

    // 当前渲染相机的参数    QGlobalCamera* curRenderCamera = _getWorld()->getMainCam();    const Matrix4& ...

  5. bzoj 2730: [HNOI2012]矿场搭建【tarjan】

    先tarjan找割点和点双连通分量,然后对一个点双,如果没有割点,那么需要建立两个出口(割掉一个另一个备用):如果只有一个割点,出口可以设立在任意一个非割点的地方:如果有两个及以上个割点,就不用建出口 ...

  6. bzoj 1715: [Usaco2006 Dec]Wormholes 虫洞【spfa判负环】

    tag是假的,用了及其诡异的方法判负环 正权无向边和负权有向边的图 #include<iostream> #include<cstdio> #include<cstrin ...

  7. 【转】@Controller和@RestController的区别

    知识点:@RestController注解相当于@ResponseBody + @Controller合在一起的作用. 1) 如果只是使用@RestController注解Controller,则Co ...

  8. javascript实现页面跳转

    这里指的页面跳转是将浏览器标签页转到新的网址. 只需要使用 window.location.href="url" 就行了 示例 <!DOCTYPE html> < ...

  9. 下载tortoisegit

    https://download.tortoisegit.org/tgit/ 藏经阁技术资料分享群二维码

  10. jQuery——表单应用(2)

    多行文本框应用之高度变化 HTML: <!--表单-多行文本框应用-高度变化--> <!DOCTYPE html> <html> <head> < ...