并发控制全解析

在数据库操作中,并发控制 是确保数据一致性和事务隔离性的关键。然而,多个事务的并发操作可能导致数据不一致,破坏数据库的ACID特性。本文将深入探讨并发操作可能带来的问题,并介绍常见的并发控制技术。

1. 并发操作带来的挑战

当多个事务同时对同一数据库进行操作时,可能会发生以下三种典型的问题:

  • 丢失修改(Lost Update)
  • 读“脏”数据(Dirty Read)
  • 不可重复读(Non-repeatable Read)

1.1 丢失修改

丢失修改 是指两个事务读取同一数据并分别进行修改,其中一个事务的结果被另一个事务的结果覆盖,导致前者的修改丢失

示例:火车票售票系统中的丢失修改

假设有两个售票点,甲和乙,它们分别运行事务T1和T2。

  1. 甲售票点 运行事务T1,读取车票余额A为16张。
  2. 乙售票点 运行事务T2,读取车票余额A也为16张。
  3. 甲售票点 卖出1张票,将A修改为15,并写回数据库。
  4. 乙售票点 卖出3张票,将A修改为13,并写回数据库。

结果: 乙售票点的修改结果覆盖了甲售票点的修改结果,导致系统中显示只卖出了3张票,而实际上卖出了4张。这就是丢失修改问题。

1.2 读“脏”数据

读“脏”数据 是指一个事务读取了另一个事务尚未提交的修改数据,结果该事务因为某种原因被撤销,导致读取的数据与最终数据库中的数据不一致。

示例:火车票售票系统中的读“脏”数据

假设甲售票点运行事务T1,乙售票点运行事务T2。

  1. 甲售票点 运行事务T1,读取车票余额A为16张。
  2. 甲售票点 卖出6张票,将A修改为10,并写入数据库。
  3. 乙售票点 运行事务T2,读取车票余额A为10张。
  4. 甲售票点 撤销了之前的操作,车票余额A恢复到16张。

结果: 乙售票点读取了一个过渡性的无效数据,即10张票的余额,而实际上数据库中的余额已经恢复到16张。这就是读“脏”数据问题。

1.3 不可重复读

不可重复读 是指一个事务在两次读取同一数据时,结果不同。通常是因为在两次读取期间,另一个事务对数据进行了修改。

示例:火车票售票系统中的不可重复读

甲售票点运行事务T1,乙售票点运行事务T2。

  1. 甲售票点 运行事务T1,读取车票余额A为16张。
  2. 乙售票点 运行事务T2,读取车票余额A也为16张。
  3. 乙售票点 卖出6张票,将A修改为10,并写回数据库。
  4. 甲售票点 再次运行事务T1,读取车票余额A,此时余额为10张。

image

提示: 不可重复读可能会导致数据的不一致性,尤其是在需要多次读取同一数据的事务中。

2. 并发控制的必要性

并发控制的主要目标是防止数据不一致性,确保事务之间的隔离性。如果不对并发操作进行控制,数据库系统将无法保证数据的正确性。

2.1 为什么需要并发控制?

  • 保证数据一致性: 并发控制确保即使多个事务同时运行,数据的一致性也不会被破坏。
  • 提高系统效率: 通过正确的并发控制,系统可以高效地处理多个事务,最大化资源利用率。

3. 常见的并发控制技术

为了处理并发操作带来的问题,数据库管理系统(DBMS)通常采用以下几种并发控制技术:

3.1 封锁(Locking)

封锁 是最常见的并发控制技术。封锁机制通过锁定数据来防止其他事务对其进行修改,从而确保数据的一致性。

  • 共享锁(S锁): 允许多个事务同时读取数据,但不允许修改。
  • 排他锁(X锁): 允许一个事务独占访问数据,其他事务既不能读也不能改。

示例: 当甲售票点读取车票余额时,系统为该数据加上共享锁,乙售票点不能修改数据,直到甲售票点释放锁。

3.2 时间戳(Timestamp)

时间戳 技术为每个事务分配一个唯一的时间戳,并根据时间戳的顺序来处理事务,确保事务之间的顺序性。

  • 时间戳排序: 事务按照时间戳的顺序执行,确保早先的事务不会被后来的事务影响。

示例: 在时间戳控制下,早于乙售票点的甲售票点事务将优先执行,确保数据的一致性。

3.3 乐观控制法(Optimistic Control)

乐观控制法 假设事务的并发冲突很少发生,因此在事务开始时不加锁,在提交时检测是否有冲突,若有冲突则回滚事务。

  • 冲突检测: 在事务提交时检查是否有其他事务修改了相同的数据,如果有,则回滚当前事务。

示例: 甲售票点和乙售票点都可以在不加锁的情况下读取和修改数据,只有在提交时才检查是否有冲突。

4. 如何避免并发操作中的数据不一致性?

为了避免并发操作带来的数据不一致性问题,开发者应根据具体应用场景选择适当的并发控制技术。

4.1 使用合适的隔离级别

数据库系统通常提供四种隔离级别:

  • 读未提交(Read Uncommitted): 允许读取未提交的数据,但易引发“脏读”问题。
  • 读已提交(Read Committed): 仅允许读取已提交的数据,避免脏读,但可能导致不可重复读。
  • 可重复读(Repeatable Read): 保证在同一个事务中多次读取结果一致,避免不可重复读。
  • 可序列化(Serializable): 提供最高级别的隔离,完全避免并发问题,但影响性能。

建议: 在不影响性能的前提下,尽量选择较高的隔离级别,如可重复读或可序列化,以确保数据一致性。

4.2 避免不必要的并发

在设计数据库操作时,尽量减少不必要的并发操作。例如,尽量减少对同一数据的频繁修改或避免在同一事务中多次读取和修改同一数据。

4.3 充分利用数据库的并发控制机制

现代DBMS提供了丰富的并发控制工具和配置选项,如锁机制、隔离级别设置等。充分利用这些机制,可以有效避免并发操作带来的数据不一致性问题。

总结

通过本文的讲解,你应该对并发控制的重要性和常见问题有了清晰的认识。丢失修改读“脏”数据不可重复读 是并发操作中常见的三大问题,而封锁时间戳乐观控制法 是应对这些问题的常见技术。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录算法训练营第五十九天 | dijkstra(堆优化版)精讲

目录 dijkstra(堆优化版)精讲 思路 堆优化细节 方法一: 最小堆优化 dijkstra(堆优化版)精讲 题目链接:卡码网:47. 参加科学大会 文章讲解:代码随想录 小明是一位科学家&#x…

Git常用命令与基本操作(包括搭建git环境)

首先,在github注册邮箱,然后再Ubuntu下安装git和ssh服务(如果实在windows下需要下载git bash,其余操作与Ubuntu相同)。 Ubuntu搭建git环境 ssh-keygen -t rsa -C "注册账号的邮箱名字" 生成SSH通信用的公钥…

Snowflake 如何通过 Apache Iceberg 和 Polaris 为大数据的未来提供动力

Snowflake 的使命是让每个组织都成为数据驱动型组织。凭借围绕 Apache Iceberg 的最新创新和 Polaris 的推出,这家数据云公司使开发人员、工程师和架构师能够比以往任何时候都更快、更轻松地利用大数据获得变革性的业务见解。 将开放标准引入数据云 Snowflake 战略的核心是采…

Elasticsearch知识点整理

数据分类 非结构化数据 全文数据。不定长或无固定格式 报错xml,HTML,Word结构化数据 行数据,由二维表结构来逻辑表达和实现的数据 非结构化数据 对于非结构化的数据 搜索主要有两种方法 顺序扫描全文检索 顺序扫描 一般不建议这么做。例如给你一张报纸&…

WEB攻防-PHP特性缺陷对比函数CTF考点CMS审计实例

知识点: 1、过滤函数缺陷绕过; 2、CTF考点与代码审计; 1、赋值 不会对比类型 类型也会对比 2、MD5 在使用比较md5的时候,只要第一位是相等的数字,则会值相等 3、intval 3、 %0a代表换行 4、 6、 7、 代码审计

STM32+ESP01连接到机智云

机智云,全球领先的智能硬件软件自助开发及物联网(iot)云服务平台。机智云平台为开发者提供了自助式智能硬件开发工具与开放的云端服务。通过傻瓜化的自助工具、完善的SDK与API服务能力最大限度降低了物联网硬件开发的技术门槛,降低开发者的研发成本,提升…

SQL Server性能优化之读写分离

理论部分: 数据库读写分离: 主库:负责数据库操作增删改 20% 多个从库:负责数据库查询操作 80% 读写分离的四种模式 1.快照发布:发布服务器按照预定的时间间隔向订阅服务器发送已发布的数据快照 2.事务发布[比较主流常见]&#xf…

【Docker Nexus3】maven 私库

1.部署环境 window 11 x64Docker Desktop 4.34.1 (166053) Docker Engine v27.2.0 1.1.Docker 镜像源 1.1.1.Docker Engine 配置 {"builder": {"features": {"buildkit": true},"gc": {"defaultKeepStorage": "32…

Windows 的 docker 删除容器后 WSL2 磁盘空间不释放的问题

1:Windows 的 docker 删除容器后 WSL2 磁盘空间不释放的问题,成功搞定 见这里的文章: https://blog.csdn.net/ppppppppila/article/details/139653675 2: 重装Docker desktop 或者 当打开Docker Desktop时候,启动dock…

【Arduino】BNO085 姿态的 3D模型 展示方法(映射到 Unity)

总览 1.arduino 代码和库等… 2.Unity 的部分,创建一个 3D 工程,然后创建一个 cube,绑定一个脚本文件 3.效果预览: 【Arduino】BNO085 姿态的 3D模型 展示方法(映射到 Unity) 一、Arduino 部分 1.使用的…

机器学习和深度学习的常见概念总结(多原创图)

目录 使用说明一、未分类损失函数(Loss Function)1. **损失函数的作用**2. **常见的损失函数**2.1. **均方误差(MSE, Mean Squared Error)**2.2. **均方根误差(RMSE, Root Mean Squared Error)**2.3. **平均…

django-admin自定义功能按钮样式

位置在原来的django-admin 栏中的上方【会因为屏幕大小而变换位置】 <!-- 这里是不会替换掉旧的 添加按钮 &#xff0c;而是添加多一个按钮【点击Crawl Data】--> <!-- /home/luichun/lc/Pyfile/Pywebback/app/paqu/templates/admin/yourmodel_changelist.html -->…

游戏爱好者离不开的录屏工具大赏

你用过录屏工具吗&#xff1f;我在做展示方案或者远程会议的时候经常会用到录屏工具。如果你也有录屏的需求那就接着往下看吧。这篇文章我将介绍几款简单教会我们怎么录屏的工具。 1.福昕录屏大师 链接达达&#xff1a;www.foxitsoftware.cn/REC/ 这个软件的操作极为简便。它…

打包部署若依(RuoYi)SpringBoot后端和Vue前端图文教程

打包后端‘ 1&#xff0c;打开若依&#xff0c;点击右侧的Maven展开Maven管理&#xff0c;选择ruoyi>Lifecycle 先双击clean清除原本启动项目时生成的文件。然后点击package等待项目打包&#xff0c;切记要取消运行再打包 打包完成后会在ruoyi-admin>src>target里面…

Axure RP 11 Beta 测试版 发布了,目前是免费试用阶段

Axure RP 11 Beta 已经发布上线了&#xff01;各位产品同学可以从下面的链接下载测试版&#xff0c;体验新功能。目前RP11处于免费试用阶段&#xff0c;没有授权的用户也可以免费使用试用版。 与 Axure RP 的以往版本一样&#xff0c;在 RP11 中保存文件后&#xff0c;无法在低…

cityengine修改纹理创建模型

数据准备 1、建筑shp面数据 2、安装好cityengine软件 3、Arcgis(非必要) 效果 1、新建工程 路径不要放C盘下 2、复制规则文件和纹理 安装软件后,这些素材在电脑上能找到,默认位置是:C:\Users{计算机名}\Documents\CityEngine\Default Workspace\ESRI.lib,如果找不到…

FP7208+FP5207:升压芯片在太阳能灯串中的应用方案

太阳能灯串是一种利用太阳能发电的高效照明装置&#xff0c;由多个太阳能灯泡串联而成。相比传统的电网供电照明设备&#xff0c;太阳能灯串具有无需外部电源、环保节能、安全可靠等优势&#xff0c;受到越来越多人的追捧和使用。 下面&#xff0c;鱼子酱将为大家介绍一套完整…

分析图形学示例报告

一、实验任务 二、主要功能模块 三、代码 //自定义坐标系模块 CDC* pDC GetDC();//获得设备上下文 CRect rect;//定义矩形 GetClientRect(&rect);//获得矩形客户去大小 pDC->SetMapMode(MM_ANISOTROPIC);//自定义坐标系 pDC->SetWindowExt(rect.Width()/4, rect.He…

深度学习-13-小语言模型之SmolLM的使用

文章附录 1 SmolLM概述1.1 SmolLM简介1.2 下载模型2 运行2.1 在CPU/GPU/多 GPU上运行模型2.2 使用torch.bfloat162.3 通过位和字节的量化版本3 应用示例4 问题及解决4.1 attention_mask和pad_token_id报错4.2 max_new_tokens=205 参考附录1 SmolLM概述 1.1 SmolLM简介 SmolLM…

白话:大型语言模型中的幻觉(Hallucinations)

大型语言模型&#xff08;LLM&#xff09;可是自然语言处理和人工智能的一大步。它们能做的事情可多了&#xff0c;比如生成听起来挺靠谱的文本&#xff0c;翻译语言&#xff0c;总结文档&#xff0c;甚至写诗。但你知道吗&#xff0c;这些模型有时候会出现 “幻觉&#xff08;…