【数据库】数据库事务原理

事务特性

https://blog.csdn.net/zxcyxg123/article/details/132020499

MVCC

MVCC(Multi-Version Concurrency Control),即多版本并发控制,是一种并发控制的方法,主要用于数据库管理系统中,以实现对数据库的并发访问。以下是对MVCC的详细解释:

  1. 目的:MVCC的主要目的是允许多个用户同时访问数据库,而不会导致数据冲突和不一致性。它通过在系统中维护多个版本的数据来实现这一目的。

  2. 工作原理

    • 当每个事务启动时,系统会为其分配一个唯一的事务ID。
    • 当一个事务要访问数据库中的某个数据时,系统会检查该数据的版本号和事务的启动时间。如果该数据的版本号早于该事务的启动时间,则该事务可以访问该数据;否则,该事务需要等待其他事务完成对该数据的访问。
    • 当一个事务修改某个数据时,系统会为该数据创建一个新版本号,并将修改后的数据存储在一个新的位置。同时,旧版本的数据仍然可用供其他事务访问。
    • 当一个事务提交时,系统会将其所做的所有修改操作都合并到数据库中,同时删除旧版本的数据。
  3. 优点

    • 提高并发访问数据库的效率。
    • 减少数据冲突和不一致性的发生。
    • 避免了在写操作进行时锁定整个表或记录,从而提高了系统的吞吐量和性能。
    • 使得事务可以看到一个一致的数据视图,不管它们需要运行多久。
  4. 使用场景

    • 读多写少的系统:在这种系统中,冲突的可能性较小,因此MVCC能提供较高的并发性能。
    • 实时系统:在实时系统中,读取的延迟需要尽可能地小。MVCC能通过读取旧的数据版本,避免由于等待写操作而产生的延迟。
    • 分布式系统:在分布式系统中,因为网络延迟和节点故障的存在,事务可能需要较长的时间才能完成。MVCC能使得这些长时间的事务不会阻塞其他的读或写操作。
  5. 实现方式:不同的数据库系统对MVCC的实现方式可能有所不同。例如,在MySQL的InnoDB存储引擎中,MVCC(多版本并发控制)的实现方式独特而高效。InnoDB通过为每一行记录添加两个额外的隐藏字段来实现MVCC,这两个字段并不直接存储数据被创建或删除的实际时间,而是存储了与这些事件相关联的系统版本号(通常称为“trx_id”和“roll_ptr”)。

    “trx_id”字段用于表示最近一次修改该行记录的事务ID。每当一个事务修改某一行数据时,该行的“trx_id”字段就会被更新为该事务的ID。

    “roll_ptr”字段是一个指向回滚段(undo log)中旧版本数据的指针。当事务修改数据时,旧的数据版本会被保存在回滚段中,并通过“roll_ptr”与新版本的数据相关联。这样,其他事务在需要读取该行数据的旧版本时,就可以通过“roll_ptr”找到相应的回滚段记录。

    通过这种方式,InnoDB能够同时支持多个事务并发访问同一行数据,而无需进行加锁操作。每个事务都可以读取到该行数据的一个“快照”,这个“快照”是该事务开始时刻该行数据的版本。即使其他事务在此期间修改了该行数据,也不会影响到当前事务读取的数据版本。

例子

老袁的账户余额100元,老张转了100元给老袁,老袁消费了50元,同时发生

Oracle

默认隔离级别:读已提交

事务A事务B
开启事务开启事务
select balance from user_account where user_name = 'oldYuan';// 100select balance from user_account where user_name = 'oldYuan';// 100
update user_account set balance = balance + 100 where user_name = 'oldYuan';// 200
select balance from user_account where user_name = 'oldYuan';// 100
提交事务
select balance from user_account where user_name = 'oldYuan';// 200
提交事务

看这个例子(错误)

事务A事务B
开启事务开启事务
select balance from user_account where user_name = 'oldYuan';// 100select balance from user_account where user_name = 'oldYuan';// 100
update user_account set balance = balance + 100 where user_name = 'oldYuan';// 200
update user_account set balance = balance - 50 where user_name = 'oldYuan';// 50
提交事务
select balance from user_account where user_name = 'oldYuan';// 200
提交事务
select balance from user_account where user_name = 'oldYuan';// 50

正确的如下

事务A事务B
开启事务开启事务
select balance from user_account where user_name = 'oldYuan';// 100select balance from user_account where user_name = 'oldYuan';// 100
update user_account set balance = balance + 100 where user_name = 'oldYuan';// 200 写锁
select balance from user_account where user_name = 'oldYuan';// 100
update user_account set balance = balance - 50 where user_name = 'oldYuan';// 阻塞
提交事务 释放写锁……
update user_account set balance = balance - 50 where user_name = 'oldYuan';//  200 - 50 = 150
提交事务

MySql

默认隔离级别:可重复读

事务A事务B
开启事务开启事务
select balance from user_account where user_name = 'oldYuan';// 100select balance from user_account where user_name = 'oldYuan';// 100
update user_account set balance = balance + 100 where user_name = 'oldYuan';// 200
提交事务
select balance from user_account where user_name = 'oldYuan';// 100
提交事务

看这个例子(错误)

事务A事务B
开启事务开启事务
select balance from user_account where user_name = 'oldYuan';// 100select balance from user_account where user_name = 'oldYuan';// 100
update user_account set balance = balance + 100 where user_name = 'oldYuan';// 200
提交事务
select balance from user_account where user_name = 'oldYuan';// 100
update user_account set balance = balance - 50 where user_name = 'oldYuan'; // 100 - 50 = 50?
提交事务

 正确如下

事务A事务B
开启事务开启事务
select balance from user_account where user_name = 'oldYuan';// 100select balance from user_account where user_name = 'oldYuan';// 100
update user_account set balance = balance + 100 where user_name = 'oldYuan';// 200
提交事务
select balance from user_account where user_name = 'oldYuan';// 100

update user_account set balance = balance - 50 where user_name = 'oldYuan';// update执行时,会使用最新版本的数据,结果是150,正确

提交事务

数据库锁

在数据库中,排他锁(Exclusive Lock)和共享锁(Shared Lock)是两种常见的锁类型,它们用于控制多个事务对同一资源的并发访问,以保证数据的一致性和完整性。

一、排他锁(Exclusive Lock)

排他锁,又称为写锁或独占锁,是一种基本的锁类型。当某个事务对数据对象(如表、行等)加上排他锁后,其他事务将无法再对该数据对象加任何类型的锁,直到持有排他锁的事务释放该锁。这就意味着持有排他锁的事务在锁释放前可以独占地读取和修改数据,而其他事务在此期间无法访问该数据。

排他锁的主要特点包括:

  1. 独占性:持有排他锁的事务可以独占地读取和修改数据,其他事务无法再对该数据加任何类型的锁。
  2. 阻塞性:如果其他事务请求对已被加排他锁的数据进行访问,将会被阻塞,直到持有排他锁的事务释放该锁。

二、共享锁(Shared Lock)

共享锁,又称为读锁,是一种允许其他事务并发读取数据的锁类型。当某个事务对数据对象加上共享锁后,其他事务可以并发地读取该数据,但任何事务都不能获取数据上的排他锁,直到已释放所有共享锁。

共享锁的主要特点包括:

  1. 并发读取:多个事务可以同时持有同一数据对象的共享锁,从而并发地读取数据。
  2. 非独占性:持有共享锁的事务不能修改数据,也不能阻止其他事务获取该数据的共享锁。但如果有事务请求对该数据加排他锁,将会被阻塞,直到所有共享锁都被释放。

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

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

相关文章

达索电磁仿真软件CST查看方式和消除2D/3D图的反射效果【官方教程】

消除2D/3D图的反射效果 查看和分析2D/3D结果时消除不必要的反射效果 View > Options > View Options > Specials 正面看CST软件的3D场分布图时,如下图所示,因为反射效果导致无法看清楚。本章节介绍一下相应的解决方法。 因为View Options的S…

GitLab CI/CD的原理及应用详解(四)

本系列文章简介: 在当今快速变化的软件开发环境中,持续集成(Continuous Integration, CI)和持续交付(Continuous Delivery, CD)已经成为提高软件开发效率、确保代码质量以及快速响应市场需求的重要手段。Gi…

RabbitMQ的用途

RabbitMQ主要有四个用途,分别是应用解耦、异步提速、削峰填谷、消息分发。详情讲解如下: RabbitMQ介绍、解耦、提速、削峰、分发 详解、RabbitMQ安装 可视化界面讲解 1.应用解耦:提高系统容错性和可维护性 2.异步提速:提升用户体验…

【18-Ⅰ】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础,通过阅读Java廖雪峰网站,简单速成了java,但对其中一些入门概念有所疏漏,阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…

PyCharm粘贴失灵?一文教你快速恢复!(如何解决Pycharm无法粘贴的问题)

文章目录 💢 问题 💢🏡 演示环境 🏡💯 解决方案 💯⚓️ 相关链接 ⚓️💢 问题 💢 "为什么你的代码编辑器突然变得不听话了?"最近在使用pycharm的时候遇到了一个问题,就是在pycharm中无法使用粘贴功能,后面经过一番折腾得到了解决,现在将我的解决…

自然资源-土地征收程序梳理

自然资源-土地征收程序梳理 土地征收是指国家为了公共利益需要,依照法律规定的程序和权限将农民集体所有的土地转化为国有土地,并依法给予被征地的农村集体经济组织和被征地农民合理补偿和妥善安置的法律行为。 1.预公告 三次公告之第一次。 《土地管…

mac中launchctl使用教程

launchctl是macOS系统中用于管理和控制系统服务和守护进程的命令行工具。下面是一些常见的launchctl命令和用法示例&#xff1a; 启动一个服务&#xff1a; launchctl start <service_name>停止一个服务&#xff1a; launchctl stop <service_name>加载一个plis…

scanf留下的那一片云彩

【题目描述】 给出一个由O和X组成的串&#xff08;长度为1&#xff5e;80&#xff09;&#xff0c;统计得分。每个O的得分为目前连续出现的O的个数&#xff0c;X的得分为0。例如&#xff0c;OOXXOXXOOO的得分为1200100123。 输入第一行表示有n个字符串&#xff0c;后续是n行字…

自然资源-城镇开发边界内详细规划编制技术指南解读

自然资源-城镇开发边界内详细规划编制技术指南解读

Xilinx 千兆以太网TEMAC IP核 AXI4-Lite接口信号

在AX4总线标准中&#xff0c;AXI4-Lite主要由向她址映射型通信。TEMAC的管理法口采用AXI4-Lite标准接口&#xff0c;TEMAC核的AX14-Lite接口信号如表1所示&#xff0c;根据AX14-Lite标准&#xff0c;接口角色分为主接口(Maser Interface)和从接口(Slave Interface)。主接口为通…

收放卷伺服控制系统详细算法介绍(电子齿轮+张力PID卷绕轴控制功能块)

收放卷控制系统涉及的内容非常多,这里我们介绍全伺服系统利用电子齿轮指令实现主从轴的比例随动速度控制,收放卷控制算法介绍常用链接如下 1、收放卷+排线控制 收放卷+排线控制系统框图-CSDN博客文章浏览阅读24次。1、收放卷前馈量计算FC收放卷前馈量计算FC(CODESYS ST源代…

以太ETH链市值机器人

在数字资产交易市场的浪潮中&#xff0c;如何高效地管理市值、提升交易流动性并保障资金安全&#xff0c;一直是交易所和项目方关注的焦点。市值管理机器人飞机//aishutuyu以太ETH链市值机器人凭借其卓越的功能和强大的安全保障&#xff0c;为数字资产交易市场带来了革命性的变…

乡村旅游指标-最美乡村数、旅游示范县数、旅行社数、景区数、农家乐数(2007-2021年)

01、数据介绍 乡村旅游也是促进乡村经济发展的有效途径。通过发展乡村旅游&#xff0c;可以带动乡村相关产业的发展&#xff0c;提高乡村居民的收入&#xff0c;促进乡村的经济发展和社会进步。此外&#xff0c;乡村旅游还能促进城乡交流&#xff0c;推动城乡统筹发展。 数据…

如何判断自己是不是依赖性人格障碍?

什么是依赖性人格障碍&#xff1f; 依赖性人格障碍&#xff0c;其主要特征就是“依赖”&#xff0c;但是这种依赖并非普通意义上的依赖&#xff0c;构成人格障碍的依赖性&#xff0c;指的是严重影响日常生活&#xff0c;甚至是脱离了依赖关系就无法独立生存的依赖。 依赖是一…

【自动驾驶|毫米波雷达】非相参积累与恒虚警率检测

目录 非相参积累&#xff08;Non-coherent combing&#xff09; 1. 非相参积累是什么? 2. 为什么要进行非相参积累&#xff1f; 3. 如何实现非相参积累&#xff1f; 恒虚警率检测&#xff08;CFAR&#xff1a;Constant False Alarm Rate&#xff09; 1.CFAR概念引入 2. C…

几个Python处理Excel实际应用

下面介绍四个不同类型的Python处理Excel的经典应用案例&#xff0c;以帮助读者更好地掌握Python处理Excel的技能。 一、读取Excel数据 Python通过pandas库可以轻松地读取Excel数据。pandas库是一个专门用于数据分析和处理的库&#xff0c;它可以将Excel中的数据读取为DataFra…

【CTF MISC】XCTF GFSJ0513 pdf Writeup(PDF隐写)

pdf 菜猫给了菜狗一张图&#xff0c;说图下面什么都没有 解法 打开 pdf&#xff0c;只看见一张图片。 用浏览器搜索 flag&#xff0c;发现图片中间藏了一行字。 复制出来&#xff0c;得到 flag。 Flag flag{security_through_obscurity}声明 本博客上发布的所有关于网络攻…

vivado Kintex-7 配置存储器器件

Kintex-7 配置存储器器件 下表所示闪存器件支持通过 Vivado 软件对 Kintex -7 器件执行擦除、空白检查、编程和验证等配置操作。 本附录中的表格所列赛灵思系列非易失性存储器将不断保持更新 &#xff0c; 并支持通过 Vivado 软件对其中所列非易失性存储器 进行擦除、…

Apache Flume概述

Apache Flume概述 1.Flume定义 ​ Flume是cloudera(CDH版本的hadoop) 开发的一个分布式、可靠、高可用的海量日志收集系统。 它将各个服务器中的数据收集起来并送到指定的地方去&#xff0c;比如说送到HDFS、Hbase&#xff0c;简单来说flume就是收集日志的。 2.Flume基础架构…

用websocket实现一个简单的im聊天功能

WebSocket前后端建立以及使用-CSDN博客 经过我上一篇的基本理解websocket的建立以及使用后&#xff0c;这篇就写一个简单的demo 实现im聊天 首先就是后端代码&#xff0c;详细解释我都放到了每一句的代码解析了&#xff0c;文章最后我会说怎么运行流程 放置后端代码 packa…