【数据库原理】(26)数据库并发控制

并发控制是数据库管理系统(DBMS)的核心功能之一。它确保在多个用户并行访问数据库时,数据库的一致性和完整性得到维护。

一.事务概述

1. 事务的定义

事务是数据库中基本的逻辑工作单位,由一系列操作组成,这些操作要么全部执行(提交),要么完全不执行(回滚)。一个事务可以是单个SQL语句、一组SQL语句或一整个程序段。

  • 事务的标记:通常使用SQL语句 BEGIN TRANSACTION 开始事务,用 COMMITROLLBACK 结束。
  • 提交(COMMIT):表示事务的所有操作都被确认,其对数据库的更改被永久保存。
  • 回滚(ROLLBACK):表示事务在执行过程中遇到问题,其所有操作被撤销,数据库回到事务开始前的状态。

2. 事务的特性(ACID)

事务的四大特性(ACID)保证了数据的一致性和系统的可恢复性。

  • 原子性(Atomicity):事务作为一个整体被执行,即全部完成或全部不执行。
  • 一致性(Consistency):事务确保数据库从一个一致的状态转换到另一个一致的状态。
  • 隔离性(Isolation):多个事务并发执行时,互不干扰,保证各事务的独立性。
  • 持久性(Durability):一旦事务提交,其结果在数据库中永久保存。

并发控制机制确保多个事务同时执行时,数据库的完整性不受影响。它模拟了事务的串行执行,即使实际上它们可能是并发运行的。这种机制是数据库管理系统性能的重要指标之一。

二.并发控制概述

并发控制是数据库管理系统(DBMS)中确保多用户环境下数据一致性和完整性的关键机制。这一机制主要是为了避免数据的丢失修改、读脏数据和不可重复读等问题,从而保障数据的准确性和一致性。

1. 并发操作可能产生的问题

在并发环境下,多个用户可能同时对同一数据进行操作,这可能导致以下几种问题:

  • 丢失修改(Lost Update):当一个事务读取数据后,另一个事务修改了这些数据,第一个事务再次读取时可能会得到不一致的结果。
  • 脏读(Dirty Read):当一个事务读取了另一个事务未提交的数据,如果后者回滚,前者读取的数据将成为无效数据。
  • 不可重复读(Non-Repeatable Read):一个事务在读取某些数据后,另一个事务对这些数据进行了修改,导致原事务无法再次读取到相同的数据。

例如,在银行账户的场景中,当两个分支机构同时对同一账户进行操作时,没有适当的并发控制可能会导致数据不一致,例如丢失修改。

2. 并发操作的调度

如果一个事物执行时,不允许其他事物并发操作,即把事务串行执行,则不会发生数据不一致的问题。正确的并发控制策略需要确保所有事务的并行执行结果与这些事务串行执行的结果相同。这种称为可串行化(serializability)的调度是许多DBMS采用的并发控制标准。

可串行化调度确保了即使在并行操作的环境下,也能保持数据的一致性和完整性。常见的并发控制技术包括锁定机制和乐观并发控制等。

三.封锁

封锁机制是数据库管理系统(DBMS)中实现并发控制的主要方式。它允许事务对其所操作的数据对象进行控制,分为三个步骤:申请加锁、获得锁以及释放锁。

1. 封锁类型

  • 排他锁(Exclusive Lock, X锁):通常用于修改数据,其他事务不能在该数据对象上加任何锁。它是独占性的,阻止其他事务读取或修改加锁数据。
  • 共享锁(Share Lock, S锁):用于读取操作,允许其他事务对同一数据对象加S锁,但不允许加X锁。这种锁是非独占的,允许多个事务读取同一数据。

2. 封锁粒度

封锁粒度指的是封锁对象的大小。封锁对象可以是数据库的一部分(如单个记录或数据页)或整个数据库。封锁粒度的选择影响系统的并发度和开销。较大的封锁粒度减少了并发度,但同时减少了系统的开销;而较小的封锁粒度则相反。

3. 封锁协议

封锁协议是关于何时加锁、锁的持续时间、何时释放锁的一套规则。

  • 保证数据一致性的三级封锁协议

    • 一级封锁协议:要求事务在修改数据前加X锁,直到事务结束才释放,防止丢失修改。
    • 二级封锁协议:在一级协议基础上,要求读取数据前加S锁,读完后即可释放,防止脏读。
    • 三级封锁协议:在一级协议基础上,要求读取数据前加S锁,直到事务结束才释放,防止不可重复读。
  • 两段锁协议(Two-phase Locking, 2PL):用于保证并行调度的可串行性。它规定事务在读写操作前必须获得锁,并且在释放任何锁之后不再获得新锁。这个协议分为“加锁阶段”和“解锁阶段”。

四.活锁与死锁

活锁和死锁都是数据库管理系统(DBMS)在并发控制时可能遇到的问题。理解它们的概念、成因和解决策略对于维护数据库系统的稳定性和效率至关重要。

1. 活锁(Livelock)

定义

  • 活锁发生在多个事务反复无果地争夺资源时,这些事务在尝试获取资源的过程中不断被阻塞,但没有进入死锁状态。

例子

  • 假设事务 T2 在等待数据对象 R,但每次 R 被释放时,其他新的事务(例如 T3、T4)总是先于 T2 获取到 R,导致 T2 一直无法执行。

解决方案

  • 采用先来先服务(First-Come, First-Served, FCFS)策略,确保事务按照申请资源的顺序获得资源。

2. 死锁(Deadlock)

定义

  • 死锁是指两个或多个事务在等待对方释放资源,从而导致它们都无法继续执行的状态。

例子

  • 事务 T1 封锁了数据对象 R1,而事务 T2 封锁了 R2。随后,T1 尝试封锁 R2,而 T2 尝试封锁 R1,导致两个事务互相等待,无法前进。

解决策略

死锁的预防方法

  1. 一次封锁法

    • 要求事务在开始时一次性获取其需要的所有资源。
    • 缺点:可能导致资源的低效使用和并发度降低。
  2. 顺序封锁法

    • 根据预定义的顺序获取资源。
    • 缺点:难以适应数据和事务动态变化的环境。

死锁的诊断与解除

  • 诊断:通过事务等待图来检测死锁的存在。如果图中出现循环等待,表明发生了死锁。
  • 解除:选择牺牲最小的事务进行回滚,以解除死锁并释放资源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/618667.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSAPP阅读笔记-信息的表示和处理

信息的表示和处理 包括整数、浮点数的存储格式、计算中可能存在的问题等 信息存储 大多数计算机使用8位的块,或者字节(byte),作为最小的可寻址的内存单位,而不是访问内存中单独的位。机器级程序将内存视为一个非常大的字节数组&#xff0c…

java实现调用http请求的几种常见方式

概述 在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适。 很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接口(短信、天气等)。 在Java项目中调用第三方接口…

fisco-bcos部署pro生产版本

我这里使用的 Ubuntu20.4系统,linux系统把操作命令apt改为yum即可 升级安装包 apt-get update 安装jdk,我这里使用jdk17 apt -y install openjdk-17-jdk-headless 查看java版本 java -version 安装依赖 apt-get install -y curl docker.io docker-com…

Linux从入门到精通(第14章 传输文件)

如何在Ubuntu上安装配置NFS_ubuntu 安装nfs-CSDN博客 遇到某些问题: 1、无权限更改文件:sudo -s 2、sudo ifconfig无法识别:sudo apt-get install net-tools 最后的效果是: 在服务端的机器上:rootsword:/nfs_shar…

【Databend】行列转化:一行变多行和简单分列

文章目录 数据准备和需求生成序列和分隔函数根据分隔符变多行JSON 数据简单分列总结 数据准备和需求 行列转化在实际工作中很常见,其中最常见的有一行变多行,有下面一份数据: drop table if exists fact_suject_data; create table if not …

基于SSM+JSP的订餐管理系统的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

金融疆界:在线支付系统渠道网关的创新设计(一)

这是《百图解码支付系统设计与实现》专栏系列文章中的第(11.1)篇。点击上方关注,深入了解支付系统的方方面面。 整个渠道网关的内容预计会分成5篇来讲:1)定位、术语、概要设计。2)领域模型、状态机设计。3…

数据结构第十三弹---链式二叉树基本操作(上)

链式二叉树 1、结构定义2、手动创建二叉树3、前序遍历4、中序遍历5、后序遍历6、层序遍历7、计算结点个数8、计算叶子结点个数9、计算第K层结点个数10、计算树的最大深度总结 1、结构定义 实现一个数据结构少不了数据的定义,所以第一步需要定义二叉树的机构。 typ…

学习笔记-mysql基础(DDL,DML,DQL)

一.DDL DDL,Data Definition Language,数据库定义语言,该语言包括以下内容: 对数据库的常用操作对表结构的常用操作修改表结构 1.对数据库的常用操作 -- 查看所有的数据库 show databases -- 创建数据库 create database [if not exists] test [charsetutf8] -- 切换 选择 …

__declspec (dllexport)定义了导出函数,但dll中没有此函数

这个一个比较低级的问题,为避免两次犯这样的低级错误,特此记录。 发生这个问题的原因是未包含头文件,例如: test.h //在头文件中声明了导出函数test() #ifdef __cplusplus extern "C" { #endif /*__cplusplus 1*/ext…

记录汇川:H5U与Factory IO测试12

主程序: 子程序: IO映射 子程序: 辅助出料 子程序: 自动程序 Factory IO配置: 实际动作如下: Factory IO测试12

基于SSM的仓库在线管理系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

20-链表-删除链表中的节点

这是链表的第20题,力扣链接。 有一个单链表的 head,我们想删除它其中的一个节点 node。 给你一个需要删除的节点 node 。你将 无法访问 第一个节点 head。 链表的所有值都是 唯一的,并且保证给定的节点 node 不是链表中的最后一个节点。 删除…

ubuntu程序性能分析

文章目录 timeperfvalgrindubuntu 重复执行命令 在Ubuntu上,可以使用一些工具来测量两段程序的计算量,如下所示: time time命令:time命令可以用于测量程序的执行时间。在终端中运行以下命令来执行程序并测量其执行时间&#xff1…

支持向量机(公式推导+举例应用)

文章目录 引言间隔与支持向量机对偶问题(拉格朗日乘子法)SMO算法核函数软间隔与正则化软间隔正则化(罚函数法) 模型的稀疏性结论实验分析 引言 在机器学习领域,支持向量机(Support Vector Machine&#xf…

蓝牙音视频远程控制协议(AVRCP) AV/C command格式介绍

零.声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。 第二篇:Trans…

生产数据不备份,用时两行泪

背景:项目使用pg一主一从,因慢sql导致查询慢,所以想从原本的4核加到16核,联系好运维后,打算先从从库开始操作,机器上的pgsql都正常关闭,然后停止,关机,扩容一切都很顺利&…

蓝桥杯基础数据结构(java版)

引言 数据结构数据结构。所以数据结构是一个抽象的概念。其目的是为了更好的组织数据方便数据存储。下面我们来看一些简单的数据储存方式 输入和输出 这里先介绍java的输入和输出。简单引入,不过多详细介绍,等我单一写一篇的时候这里会挂上链接 简单的…

OpenCV-Python(34):FAST算法

目标 理解 FAST 算法的基础使用OpenCV 中的FAST 算法相关函数进行角点检测 介绍 FAST算法(Features from Accelerated Segment Test)是一种用于在图像中快速检测角点的算法。它是一种基于像素的检测方法,具有高效、准确的特点,常…

【算法分析与设计】最短路径和

题目: 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例: 示例 1: 输入:grid [[1,3,1],…