首页 > 数据库 >松理解数据库并发调度与可串行性

松理解数据库并发调度与可串行性

时间:2024-09-16 14:50:41浏览次数:13  
标签:事务 执行 数据库 调度 并发 冲突 串行 串行化

前言

在数据库系统中,多个事务的并发执行是不可避免的。然而,并发执行可能导致数据不一致的情况。为了解决这个问题,数据库管理系统(DBMS)使用调度策略来控制事务的执行顺序。本文将简洁地介绍可串行化调度这一概念,帮助你理解如何确保多个事务的并发执行不会导致数据错误。


什么是可串行化调度?

可串行化调度 是指多个事务并发执行的结果,必须与某种顺序下串行执行这些事务的结果相同。换句话说,即使事务是交叉执行的,只要结果和按某个顺序串行执行时的结果一致,我们就可以认为这个调度是正确的。

为什么可串行化调度重要?
在一个理想的数据库环境中,所有事务都应该串行执行,这样可以确保数据的一致性。然而,现实中事务往往是并发执行的。如果不加控制,可能会导致数据不一致。因此,确保并发调度的结果与串行执行的结果相同,是保证数据正确性的关键。


可串行化调度的例子

image

让我们来看一个简单的例子,以便更好地理解可串行化调度。

事务T1

  1. 读取数据B
  2. A = B + 1
  3. 写回A

事务T2

  1. 读取数据A
  2. B = A + 1
  3. 写回B

假设数据A和B的初值都是2。根据不同的调度策略,结果可能会有所不同:

  • 串行调度1(T1先执行,T2后执行)

    • T1执行后,A = 3,B = 2。
    • T2接着执行,B = A + 1 = 3。
      最终结果:A = 3,B = 3。
  • 串行调度2(T2先执行,T1后执行)

    • T2执行后,B = 3,A = 2。
    • T1接着执行,A = B + 1 = 4。
      最终结果:A = 4,B = 3。

并发调度
如果事务T1和T2同时执行,但没有进行正确的调度控制,可能会发生不可预料的结果。例如,如果T1读取了B的旧值2,T2读取了A的旧值2,那么最后可能会得到A = 3,B = 3,这与任何一种串行调度的结果都不相同。因此,这样的调度是不可串行化的。


冲突可串行化调度

在并发事务中,如果不同事务对同一数据的操作涉及到至少一个写操作,就会产生冲突。冲突的操作是不能交换执行的,它们必须保持一定的执行顺序。我们称这样的调度为冲突可串行化

冲突的类型

image

  1. 读-读冲突:两个事务读取同一个数据(不冲突)。
  2. 写-读冲突:一个事务写数据,另一个事务读同一数据(冲突)。
  3. 读-写冲突:一个事务读数据,另一个事务写同一数据(冲突)。
  4. 写-写冲突:两个事务都写同一个数据(冲突)。

举例

image假设有两个事务T1和T2,T1读写数据A,T2读写数据B,且它们的操作顺序如下:

  • T1:读A -> 写A -> 读B -> 写B
  • T2:读A -> 写A -> 读B -> 写B

在这种情况下,T1和T2的操作顺序发生了一些交错,如果通过交换不冲突的操作,能够将它们的操作顺序调整为某种串行顺序,那么这个调度就称为冲突可串行化


如何判断调度是否是冲突可串行化的?

判断一个调度是否是冲突可串行化的,可以通过交换不冲突的操作来实现。如果在保证冲突操作顺序不变的前提下,能够通过交换不冲突的操作将调度转换为串行调度,那么该调度就是冲突可串行化的。

例子

image
假设有一个调度SC=R1(A) W1(A) R2(A) W2(A) R1(B) W1(B) R2(B) W2(B),我们可以通过交换不冲突的操作来判断它是否为冲突可串行化的调度。

  • R1(B) 和 W2(A) 是不同事务对不同数据的操作,不冲突,可以交换。
  • 继续交换其他不冲突的操作,直到形成一个串行调度。

最终我们得到的调度与串行调度一致,因此这个调度是冲突可串行化的。


总结:可串行化调度的实际应用

在实际的数据库系统中,可串行化调度 是并发控制的核心原则之一。它确保了多个事务并发执行时,不会引发数据的不一致性问题。通过使用冲突可串行化的判断标准,数据库系统可以在保证正确性的前提下,提高并发执行的效率。

标签:事务,执行,数据库,调度,并发,冲突,串行,串行化
From: https://blog.csdn.net/2301_80064376/article/details/142202713

相关文章

  • Mysql数据库的原理和应用
    第一章数据库概述一学习环境介绍1.Windows10/11非家庭版内存8g2.Vmwareworkstation16.03.LAMP--LinuxAparchemysqlPHPLNMP--LinuxnginxmysqlPHPWAMP--WindowsAparchemysqlPHPWNMP--WindowsnginxmysqlPHP注意:Windows是非客服端操作系统,而是服务器版......
  • 并发与并行的区别:深入理解Go语言中的核心概念
    在编程中,并发与并行的区别往往被忽视或误解。很多开发者在谈论这两个概念时,常常把它们混为一谈,认为它们都指“多个任务同时运行”。但实际上,这种说法并不完全正确。如果我们深入探讨并发和并行的区别,会发现它不仅是词语上的不同,更是编程中非常重要的抽象层次,特别是在Go语言......
  • Springboot个性化学习推荐网站ua750程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景与意义随着互联网技术的飞速发展,学习方式正经历着深刻的变革。传统教育模式已难以满足学习者日益增长的个性化需求。个性化学习推荐网......
  • Springboot个人健康管理系统tfg73--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景与意义随着生活节奏的加快和健康意识的提升,个人健康管理已成为现代人关注的焦点。传统的健康管理方式往往依赖于定期体检和医生指导,缺......
  • Springboot工商闲置单车销售平台2r343(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景与意义随着城市化进程的加快和单车市场的快速发展,大量商家和个人拥有闲置单车,这些单车不仅占用了宝贵的空间资源,还造成了环境浪费。因......
  • 并发容器(Map、List、Set)实战及其原理分析
    1.JUC包下的并发容器Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map,大家熟知的这些集合类ArrayList、LinkedList、HashMap这些容器都是非线程安全的。所以,Java先提供了同步容器供用户使用。同步容器可以简单地理解为通过synchronized来实现同步的容器,比如Vector......
  • ​关系型数据库(九)SQL索引
    索引(Index):索引的作用就相当于书的目录。打个比方:我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢。如果有目录了,我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。但是目录是要占页数的,数据库的索引页也是要占空间的数据......
  • 数据库tips19
    分布式数据库系统中的两阶段提交协议(2PC),其内容为:协调器向所有参与者发送Prepare消息;各参与者若愿意提交属于自己的部分,则向协调器发ready消息,否则发abort消息;协调器收到所有参与者的ready消息后,方能再向所有参与者发commit消息,否则若超时或有一个参与者发来了abort消息,则协调......
  • 【大数据分析】基于Spark哔哩哔哩数据分析舆情推荐系统 b站(完整系统源码+数据库+开发
    文章目录【大数据分析】基于Spark哔哩哔哩数据分析舆情推荐系统b站(完整系统源码+数据库+开发笔记+详细部署教程+虚拟机分布式启动教程)✅一、项目概述二、研究意义三、背景四、国内外研究现状五、开发技术介绍六、算法介绍 七、数据库设计 八、系统启动九、项目展......
  • 数据库索引分类以及底层数据结构
    数据库索引的分类和底层数据结构直接决定了它在不同场景下的性能和适用性。以下是数据库索引的主要分类及其底层数据结构的详细分析:一、数据库索引的分类1.主键索引(PrimaryKeyIndex)分类:唯一性索引的一种特殊形式。特点:对主键列创建的索引,保证唯一性且不能为空。底层结构:B......