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

如图会导致,不可重复读

如果这里用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. TQ2440 学习笔记—— 1、Windows平台下开发工具安装与环境建立

    板子:广州天嵌公司的TQ2440,处理器为三星的S3C2440 1.开发工具的安装与环境建立 系统:win7  64位 SecureCRT软件:该软件能够取代Windows中的超级终端,是个非常好的串 ...

  2. spark hadoop 对比 Resilient Distributed Datasets

    hadoop 迭代消耗大 每次迭代启动一个完整的MapReduce作业 spark 首要目标就是避免运算时 过多的网络和磁盘IO开销 Resilient Distributed Datasets ht ...

  3. (转)C3P0配置

    C3P0是一个开源的JDBC 连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有Hibernate,Spring等. sourceforge 下载: ...

  4. 167. Two Sum II - Input array is sorted (二分ortwo-pointer)

    Given an array of integers that is already sorted in ascending order, find two numbers such that the ...

  5. Tiny4412汇编流水灯代码,Tiny4412裸机LED操作【转】

    本转载自:http://www.techbulo.com/1313.html Tiny4412汇编流水灯代码,Tiny4412裸机LED操作 2014年10月20日 ⁄ 裸机程序 ⁄ 共 4171字 ...

  6. 玲珑学院OJ 1028 - Bob and Alice are playing numbers 字典树,dp

    http://www.ifrog.cc/acm/problem/1028 题解处:http://www.ifrog.cc/acm/solution/4 #include <cstdio> ...

  7. python-----查看显卡gpu信息

    需要安装pynvml库. 下载地址为:https://pypi.org/project/nvidia-ml-py/#history pip安装的命令为: pip install nvidia-ml-p ...

  8. MySQL5.7修改字符集

    本人安装的mysql版本是5.7.20,安装好mysql后就要对字符集进行修改了,于是照着网上的大部分教程说的去安装目录找一个my-default.ini文件,然后重命名为my.ini,再对其进修改字 ...

  9. asp.net 4.0 尚未在服务商注册 您需要手动将web服务器配置为 ASP.NET4.0,这样您的网站才能正常进行。

    VS2010打开项目出现的此问题 电脑先安装VS2010 然后安装VS2010 SP1补丁.然后安装VS2015 后来又安装了Framework4.6.1 用网上搜索到的平常方法无法解决此问题. 最后 ...

  10. AutoCAD C# 利用反射导出所注册的命令

    主函数导出某一程序集AutoCAD 注册命令 /// <summary> ///提取所有的命令 /// </summary> /// <param name=" ...