专栏首页技术进阶之路事务并发调度的可串行性及两段锁协议

事务并发调度的可串行性及两段锁协议

一、并发调度


并发调度啥意思?

就是当很多事务同时执行的时候应该按照什么顺序执行,应该按照排队的顺序执行,这就是 串行调度

串行执行肯定是正确的,但是改变一下位置有影响吗?

这就要看改变顺序之后执行的结果是否和不改变顺序执行的结果一致了。

如果改变顺序之后执行的结果和串行调度的执行结果一致,那么就说这种调度是 可串行化调度

可串行性是并发事务正确调度的准则。

比如:

事务 T1: 读 B A=B+1;写回 A;
事务 T2: 读 A B=A+1;写回 B;

假设 A、B 的初始值都是 2,串行调度指的就是先执行 T1 再执行 T2,或者先执行 T2 再执行 T1,这是没有区别的,都是正确的。

1、先执行 T1:结果是 A=3,B=4;
2、先执行 T2:结果是 B=3,A=4;

其实这里执行的顺序可以是(R代表读,W代表写),这两个都是 串行调度

1、R1(B)  W1(A)  R2(A)  W2(B)
2、R2(A)  W2(B)  R1(B)  W1(A)

我们只需要保证对同一数据对象的 读写(写读)操作写写操作 的相对位置不变即可。

涉及对同一数据对象的读写操作称为 冲突操作

解释一下前面的意思,这里的同一数据对象假设是 A ,W1(A) R2(A) 就是对同一数据对象的读写操作,那么他们的顺序是不能调换的,不然数据的结果就会改变。这里的顺序是先 写A 再读 A ,相对位置指的是他们中间可以有其他的操作。

比如,在上一个例子中,如果执行的顺序改成下面的样子:

R1(B)  R2(A)  W1(A)  W2(B)

这就不对了,因为改变了关于数据对象 A 的读写顺序,应该是先写再读,因为这两个是冲突操作,所以不能随便调换位置,现在调换了无论如何也不能通过 交换不冲突操作的位置 变成那两个串行调度中的任何一个了。

总之:不管是同一个事务还是多个事务操作,只要是涉及对同一数据对象的 读写操作写写操作 调换顺序的时候就要谨慎一点,不要改变了原来的结果。

除了冲突操作之外的操作称为不冲突操作,如果一个调度通过 交换不冲突操作 的次序得到的另一个调度是串行的,那么称这个调度为 冲突可串行化 的调度。

冲突可串行化调度只是可串行化调度的一种。有的时候就算改变了位置结果也不变。

二、两段锁协议


两段锁协议是为了保证事务并发调度的正确性,简称 2PL 协议。

  • 第一阶段是获得锁:扩展阶段:只允许加锁;
  • 第二阶段是释放封锁:收缩阶段:只允许解锁;

如果并发执行的所有事务都遵循两段锁协议,那么对这些事务的任何并发调度都是可串行化的。

可能大家回想到预防死锁时使用的 一次封锁法 。他们的区别在于两段锁协议只是说加锁的时候在一个阶段完成,没说要用的所有数据都必须加锁,而后者则要求所有使用到的数据必须加锁而且是在刚开始的加锁时期;所以只要是使用一次封锁法的协议都遵循两段锁协议,同时也说明两段锁协议也有死锁问题。

关于死锁这里提一嘴,有两种方法解决:

  • 一是预防:一次封锁法、顺序封锁法;
  • 二是解决:超时法、等待图法。

其中等待图法指的是有一个 有向图 ,每个 节点 表示正在执行的事务,每个 表示事务等待的情况,如果图中存在环路则说明出现了死锁。一般是选择一个处理死锁代价最小的事务,将其撤销,释放此事务持有的所有的锁,使其他事务继续运行下去。

另外对于封锁对象的大小不同,比如封锁一个元组,一张表或者整个数据库,分为不同的封锁粒度;这个时候就要分粒度封锁,在分粒度封锁的基础之上又发明了一种方法叫做意向锁

那么这个意向锁又是个什么东西呢?

意向锁建立在一个多粒度树上面,多粒度树就是将整个数据库按照对象的大小建立一棵树;

这个时候你在一个节点上面加上一个意向锁,那么它以及他的子节点默认被加锁;

具有意向锁的多粒度封锁方法提高了系统的并发度,减少了加锁和解锁的开销。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 多线程爬虫入门及问题解决(爬取表情包)

    我们写这段代码的初衷是因为刚开始的时候 IMG_LIST 可能是 0 ,因为生产者还没来得及做,所以让消费者等一下生产者,所以 continue,但是设想一下到...

    wsuo
  • 使用封锁协议解决事务的并发问题

    丢失修改由两次事务的修改导致,比如事务 T1 修改 A,同时事务 T2 也修改 A,那么最后 A 的值将由事务 T2 的修改结果决定,这样事务 T1 的修改就没...

    wsuo
  • Design Patterns 之命令模式

    在许多设计中,经常会出现一个对象直接请求另一个对象调用其方法以达到某种目的的行为,这里的两个类之间就会出现紧耦合。这很不好,所以我们应该将 方法的请求者 和 方...

    wsuo
  • 一文讲透微服务下如何保证事务的一致性

    什么是事务?回答这个问题之前,我们先来看一个经典的场景:支付宝等交易平台的转账。假设小明需要用支付宝给小红转账 100000 元,此时,小明帐号会少 10000...

    用户2781897
  • 不再是爷爷时代的AGV,移动机器人该控制AGV还是机械臂?

    什么是移动机器人?许多人首先想到的是传统的AGV,但那已经过时了。根据RIA的最新定义,能够自主自由移动的AGV才算是移动机器人,当然,它上面可能还安装有机械臂...

    机器人网
  • AI新闻报简单自学机器学习理论——正则化和偏置方差的权衡

    在第一部分探讨了统计模型潜在的机器学习问题,并用它公式化获得最小泛化误差这一问题;在第二部分通过建立关于难懂的泛化误差的理论去得到实际能够估计得到的经验误差,最...

    企鹅号小编
  • 很好理解的分布式事务

    事务是保证一系列操作是一个整体,要么都执行,要么都不执行。比如A给B转账,A扣钱了,B的账户的钱也要加上去,不能出现A扣钱B不加钱,或者B加钱A不扣钱的情况。在...

    逝兮诚
  • 微服务通信中的设计模式

    我在上一篇文章中,我谈到了微服务中涉及到的设计模式。现在,我想深更深入介绍微服务架构中最重要的设计模式:微服务之间的数据通讯。当我们用于开发独立应用程序时通讯是...

    程序你好
  • VBA解析复合文档04——解析目录信息

    目录信息存放的才是复合文档中的真正数据的一些信息,也只有通过目录信息才能正确读取到数据流:

    xyj
  • 基于 Node.js 的 Serverless 架构实践

    通过将 BFF 构建于 serverless 之上,将人工智能实验室(天猫精灵)数十个中后台应用整合到了一个统一入口。用云函数的方式取代了传统基于 NodeJS...

    五月君

扫码关注云+社区

领取腾讯云代金券