当前位置: 首页 > news >正文

深入理解数据库并发控制原理

  并发控制原理

  事务之间的相互影响可能导致数据库状态的不一致,即使各个事务能保持状态的正确性,而且也没有任何故障发生。因此,不同事务中各个步骤的执行顺序必须以某种方式进行规范。控制这些步骤的功能由DBMS的调度器部件完成,而保证并发执行的事务能保持一致性的整个过程称为并发控制。调度器的作用如图1所示。

  

  首先讨论如何保证并发执行的事务能保持数据库状态的正确性。抽象的要求称为可串行性,另外还有一个更强的、重要的条件为冲突可串行性,它是大多数调度器所真正实现的。我们考虑实现调度器的最重要技术:封锁、时间戳和有效性确认。

  1.串行调度和可串行化调度

  1.1 调度

  调度是一个或多个事务的重要操作按时间排序的一个序列。

  例1 考虑两个事务以及它们的动作按照某些顺序执行时的数据库的影响。T1和T2的重要动作如表1所示。

1 两个事务
T1
T2
READ(A,t)
READ(A,s)
t := t + 100
s := s*2
WRITE(A,t)
WRITE(A,s)
READ(B,t)
READ(B,s)
t := t + 100
s := s*2
WRTIE(B,t)
WRITE(B,s)

  1.2 串行调度

  如果一个调度的动作首先是一个事务的所有动作,然后是另一个事务的所有动作,以此类推,而没有动作的混合,那么我们说这一调度是串行的。

  例2 对表1中的事务而言,两个串口调度,一个是T1在T2前,而另一个是T2是T1之前,初态为A=B=25。

2T1T2前的串行调度

T1
T2
A
B
25
25
READ(A,t)
t := t + 100
WRITE(A,t)
125
READ(B,t)
t := t + 100
WRTIE(B,t)
125
READ(A,s)
s := s*2
WRITE(A,s)
250
READ(B,s)
s := s*2
WRITE(B,s)
250
3 T2T1前的串行调度

T1
T2
A
B
25
25
READ(A,t)
t := t + 100
WRITE(A,t)
50
READ(B,t)
t := t + 100
WRTIE(B,t)
50
READ(A,s)
s := s*2
WRITE(A,s)
150
READ(B,s)
s := s*2
WRITE(B,s)
150

  1.3 可串行化调度

  事务的正确性原则告诉我们,每个串行调度都将保持数据库状态的一致性。

  通常,不管数据库初态怎样,一个调度对数据库状态的影响都和某个串行调度相同,我们就说这个调度是可串行化的。

  例3 表4是例1中事务的一个调度,此调度是可串行化的,但不是串行的。表5不是可串行化的。

5 一个非串行的可串行化调度

T1
T2
A
B
25
25
READ(A,t)
t := t + 100
WRITE(A,t)
125
READ(A,s)
s := s*2
WRITE(A,s)
250
READ(B,t)
t := t + 100
WRTIE(B,t)
125
READ(B,s)
s := s*2
WRITE(B,s)
250
6 一个非可串行化的调度

T1
T2
A
B
25
25
READ(A,t)
t := t + 100
WRITE(A,t)
125
READ(A,s)
s := s*2
WRITE(A,s)
250
READ(B,s)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python怎么用for循环_python -for循环
  • AJAX的WEB开发工具
  • python入门知识图谱整理_零基础入门知识图谱技术到应用开发实战
  • Sun培训开放日
  • python多页网站目录_2:url有规律的多页面爬取
  • 淡水河边的夕阳-台北印象
  • python常问问题_python常见问题
  • Cisco路由器安全配置方案
  • crc32算法_业务开发中你用到了哪些算法?
  • ORA-00600 关联规则建模错误
  • python基于值得内存_浅谈Python 对象内存占用
  • 我的最大收获
  • 电力装置的继电保护和自动装置设计规范_电力工程的继电保护和安全自动装置设计原则(注电多选373)...
  • 好差的英语
  • 订阅发布延时_网关实现灰度发布
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • canvas 高仿 Apple Watch 表盘
  • JAVA并发编程--1.基础概念
  • MQ框架的比较
  • Vue--数据传输
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 回流、重绘及其优化
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 经典排序算法及其 Java 实现
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 通过几道题目学习二叉搜索树
  • 微服务核心架构梳理
  • 学习HTTP相关知识笔记
  • 学习Vue.js的五个小例子
  • 自定义函数
  • Java性能优化之JVM GC(垃圾回收机制)
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (26)4.7 字符函数和字符串函数
  • (bean配置类的注解开发)学习Spring的第十三天
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (void) (_x == _y)的作用
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (六)DockerCompose安装与配置
  • (四)Linux Shell编程——输入输出重定向
  • (一)u-boot-nand.bin的下载
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .net 4.0发布后不能正常显示图片问题
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET WPF 抖动动画
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .Net接口调试与案例
  • ::
  • ??myeclipse+tomcat