postgrsql——事务概述
事务概述
事务的特性
- 原子性(Atomicity):
- 事务被视为一个整体,其中的操作要么全部执行成功,要么全部不执行,即不存在部分执行的情况。这确保了事务的完整性和一致性。
- 一致性(Consistency):
- 事务在执行前后,数据库的状态必须保持一致。即事务的执行结果必须满足数据库的所有规则和约束,以维护数据的完整性。
- 隔离性(Isolation):
- 事务的执行应该相互独立,互不干扰。一个事务的执行结果不应该被其他并发执行的事务所影响,这通过数据库管理系统提供的隔离级别来实现。
- 持久性(Durability):
- 一旦事务被提交,其对数据库的修改就是永久性的,即使系统发生故障也不会丢失。这确保了数据的可靠性和稳定性。
事务的作用
- 保证数据的一致性:
- 通过事务的原子性特性,确保在一组操作中,要么所有操作都成功执行,要么全部回滚,从而保证数据库的数据一致性。
- 确保数据的完整性:
- 事务通过ACID属性(原子性、一致性、隔离性和持久性)来确保数据的完整性,防止数据丢失或损坏。
- 提供隔离性:
- 事务的隔离性确保了多个并发事务之间的隔离,避免了数据交叉访问和干扰,保证了每个事务的独立性。
- 支持回滚和恢复:
- 在事务执行过程中,如果发生错误或异常情况,可以通过回滚操作将数据库恢复到事务开始前的状态,保证数据的可靠性和稳定性。
综上所述,事务是数据库管理系统中保证数据一致性、完整性和可靠性的重要机制。通过事务的ACID属性,可以确保数据库操作的原子性、一致性、隔离性和持久性,从而满足各种复杂的应用需求。
事务的一致性
事务的一致性(Consistency)是数据库事务管理中一个至关重要的特性,它确保了事务执行前后数据库的状态都满足所有定义的规则和约束。换句话说,一致性要求事务的执行结果必须使数据库从一个一致的状态转换到另一个一致的状态。
在事务的上下文中,一致性通常涉及以下几个方面:
- 数据的完整性:事务的执行不能破坏数据库中数据的完整性约束,如主键约束、外键约束、唯一性约束、检查约束等。这些约束用于维护数据的准确性和可靠性。
- 业务规则:除了数据库本身的约束外,事务还需要遵守应用程序定义的业务规则。例如,在银行账户转账的场景中,转账事务必须确保转出账户的余额足够,并且在转账后两个账户的余额总和保持不变。
- 数据的逻辑一致性:事务的执行结果应该符合数据的逻辑定义和预期的业务逻辑。例如,在库存管理系统中,一个减少库存数量的事务必须确保库存数量不会变为负数。
- 数据依赖关系:在复杂的数据关系中,事务的执行可能需要考虑数据之间的依赖关系。一致性要求事务的执行不能破坏这些依赖关系,以保持数据的逻辑一致性。
为了保持事务的一致性,数据库管理系统(DBMS)通常会在事务执行过程中进行一系列的检查和验证。如果事务违反了任何一致性约束或规则,DBMS将拒绝执行该事务或回滚已执行的操作,以恢复数据库到一致的状态。
此外,事务的一致性还与事务的隔离性密切相关。虽然隔离性主要关注事务之间的并发控制,但它也间接地影响了一致性,因为并发事务可能会相互干扰并破坏数据的一致性。因此,数据库系统通过提供不同级别的隔离性来平衡一致性和并发性之间的需求。
总之,事务的一致性是数据库事务管理中不可或缺的特性之一,它确保了事务执行前后数据库状态的一致性和数据的完整性。通过遵守数据库的约束、业务规则和数据依赖关系,事务能够维护数据的逻辑一致性和可靠性。
事务的隔离级别
SHOW TRANSACTION ISOLATION LEVEL;
SELECT current_setting('transaction_isolation');
事务的隔离级别是数据库管理系统(DBMS)中用于处理并发事务时可能发生的各种问题的关键概念。SQL标准定义了四种隔离级别,由低到高依次为:
- 读未提交(Read Uncommitted):
但在内部,实际上只有三种独立的隔离级别,分别对应读已提交,可重复读和可串行化。
-
- 这是最低的隔离级别。
- 在此级别下,一个事务可以读取另一个事务尚未提交的数据修改。
- 这可能会导致“脏读”问题,即一个事务读取到了另一个事务尚未提交的数据,而后者可能会在后续被回滚,从而导致读取到的数据实际上是无效的。
- 由于允许脏读,读未提交的隔离级别无法保证事务的一致性,且通常不推荐在生产环境中使用。
- 读已提交(Read Committed):
- 在此级别下,一个事务只能读取到已经提交的数据修改。
- 这避免了脏读问题,但仍然存在“不可重复读”的风险,即在同一事务中多次读取同一数据,可能会因为其他事务的提交而导致结果不一致。
- 读已提交隔离级别提供了一定程度的数据隔离,但无法解决幻读问题。
- 可重复读(Repeatable Read):
- 此级别提供了比读已提交更高的隔离性。
- 在可重复读隔离级别下,一个事务在执行过程中多次读取同一行数据,可以得到一致的结果,即使其他事务对数据进行了修改也不会影响到当前事务的读取结果。
- 它解决了不可重复读问题,但在某些情况下仍然可能出现“幻读”,即在同一事务中多次执行相同的查询,但结果集却不一致,通常是由于其他事务插入了符合查询条件的新数据。
- 需要注意的是,不同的数据库系统(如MySQL的InnoDB引擎)可能通过特定的机制(如next-key锁)来进一步解决幻读问题。
- 串行化(Serializable):
- 这是最高的隔离级别。
- 在串行化隔离级别下,事务之间具有完全的隔离性,每个事务都像是在独立的执行环境中执行一样,互不干扰。
- 它可以完全避免脏读、不可重复读和幻读等并发问题。
- 但是,由于事务之间需要串行执行,这可能会导致系统性能显著下降,因此在实际应用中需要权衡数据一致性和系统性能的需求。
在实际应用中,选择合适的隔离级别需要根据具体的业务场景和需求来决定。例如,在需要高并发但对数据一致性要求不高的场景下,可以选择较低的隔离级别;而在对数据一致性要求极高的场景下,则可能需要选择更高的隔离级别甚至串行化级别。同时,数据库系统通常也提供了相应的配置选项来允许用户根据需要调整事务的隔离级别。
需要注意的是,虽然SQL标准定义了这四种隔离级别,但不同的数据库系统可能会在实现上有所差异。因此,在使用特定数据库系统时,需要参考该系统的官方文档来了解其事务隔离级别的具体实现和特性。
事务并发mvcc
事务的MVCC(Multi-Version Concurrency Control,多版本并发控制)模式是一种用于实现事务隔离性的并发控制机制,常见于许多数据库管理系统(如MySQL的InnoDB引擎和PostgreSQL)中。MVCC通过创建数据的多个版本,并为每个事务提供适当的版本来实现并发访问数据而不会相互干扰的目的。以下是关于事务MVCC模式的详细解析:
MVCC的基本概念
1. 定义
MVCC是一种并发控制的方法,用于在数据库管理系统中实现对数据库的并发访问。它通过维护数据的多个版本来避免读写冲突,从而提高数据库的并发性能。
2. 核心思想
MVCC的核心思想是为每个事务创建一个独立的数据视图,该视图反映了在事务开始时数据库的一致状态。每个事务在执行读操作时,只能看到在其开始之前已经提交的版本。
数据版本
MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种在数据库管理系统中实现并发控制的技术,它通过保留数据的多个版本来实现事务的隔离性,从而允许读写操作同时进行,提高数据库的并发性能和响应能力。在MVCC中,数据版本是核心概念之一,具体来说,数据版本指的是数据在特定时间点的状态或记录。
数据版本的核心要素
在MVCC机制下,数据版本通常包含以下几个关键信息:
- 事务ID(Transaction ID):标识了生成该数据版本的事务。每当事务对数据进行修改时,都会生成一个新的数据版本,并将该事务的ID与该版本关联起来。
- 数据内容:即事务修改后的数据值。每个版本都保存了数据在某一时刻的具体内容。
- 版本链信息:在支持MVCC的数据库中,如MySQL的InnoDB存储引擎,会通过一种称为“版本链”的数据结构来管理数据的多个版本。版本链中的每个节点都代表了一个数据版本,通过指针(如roll_ptr)将不同版本的数据连接起来。这样,系统就可以通过遍历版本链来访问数据的不同版本。数据版本的生成与管理
- 数据修改时生成新版本:当事务对数据库中的数据进行修改时,MVCC机制会生成一个新的数据版本,并将旧版本的数据保存到undo日志中。新版本的数据会包含事务ID、修改后的数据内容以及指向旧版本的指针(如果适用)。
- 版本的选择与可见性:事务在读取数据时,会根据其隔离级别和当前系统的状态来选择合适的数据版本进行读取。例如,在可重复读(Repeatable Read)隔离级别下,事务会读取事务开始时数据库的快照中的数据版本;而在读已提交(Read Committed)隔离级别下,事务会读取最新的已提交事务修改的数据版本。
- 垃圾回收:随着时间的推移和事务的不断执行,数据库中会积累大量的旧数据版本。为了节省存储空间并提高性能,MVCC机制会定期执行垃圾回收操作,清理那些不再被任何事务需要的旧版本数据。
-
-
- 总结
-
-
MVCC的数据版本是指数据在特定时间点的状态或记录,它包含了事务ID、数据内容以及版本链信息等关键信息。通过管理数据的多个版本,MVCC机制能够在保证数据一致性的同时提高数据库的并发性能。
-
-
- Pg数据库的数据版本
-
PostgreSQL(简称PG)数据库的MVCC(Multi-Version Concurrency Control,多版本并发控制)机制中,数据版本是核心概念之一。在PostgreSQL中,数据版本是指数据在特定时间点的状态或记录,这些版本通过一系列的内部机制来管理和维护,以确保事务的隔离性和一致性。
-
-
-
- 数据版本的核心要素
-
-
- 事务ID(Transaction ID,XID):
- 事务ID是PostgreSQL中用于唯一标识事务的标识符。在MVCC中,每个事务在创建时都会被分配一个递增的事务ID。
- 事务ID在数据库中是全局唯一的,并且用于关联每个事务对数据库所做的修改(即数据版本)。
- 版本链(Version Chain):
- 对于数据库中的每个数据行,PostgreSQL都会维护一个版本链。这个链表记录了不同事务对该数据行所做的所有修改,每个节点代表一个数据版本。
- 当数据行被更新时,会创建一个新的数据版本并将其添加到版本链的头部,而旧版本则通过链表结构保留下来。
- 可见性规则(Visibility Rules):
- PostgreSQL定义了一套可见性规则,用于确定哪些数据版本对于特定事务是可见的。
- 这些规则通常基于事务的开始时间戳(即事务ID的创建时间)来判断。一个事务只能看到在其开始时间之前已经提交的事务所创建的数据版本。
数据版本的管理
- 读取操作:
- 当事务执行读取操作时,PostgreSQL会根据该事务的快照(Snapshot)和可见性规则来确定哪些数据版本是可见的。
- 快照是在事务开始时创建的,记录了数据库在那一刻的状态。事务在整个执行过程中都会使用这个快照来读取数据。
- 写入操作:
- 当事务执行写入(包括INSERT、UPDATE、DELETE)操作时,PostgreSQL不会直接在原始数据上进行修改,而是创建一个新的数据版本。
- 这个新版本会被添加到相应数据行的版本链中,并更新相关的事务ID和可见性信息。
- 垃圾回收:
- 随着时间的推移,版本链会变得越来越长,导致性能下降和存储空间浪费。
- PostgreSQL通过定期执行VACUUM操作来清理不再需要的数据版本(即那些对任何当前或未来事务都不可见的数据版本)。
总结
PostgreSQL的MVCC机制通过事务ID、版本链和可见性规则等核心要素来管理数据版本。这种机制允许多个事务同时读写数据库中的数据,而不会相互干扰,从而提高了数据库的并发性能和响应能力。同时,通过定期的垃圾回收操作,PostgreSQL能够保持数据库的性能和存储效率。
MVCC的实现原理
1. 隐藏列字段
在支持MVCC的数据库中,每行记录除了用户自定义的字段外,还包含了一些隐藏字段,用于跟踪和管理事务的相关信息。这些字段通常包括事务ID(DB_TRX_ID)、回滚指针(DB_ROLL_PTR)、行ID(DB_ROW_ID)等。
2. UNDO日志
UNDO日志是数据库系统中的一种日志,用于记录事务所做的修改操作的逆向操作,以便在需要回滚事务或恢复数据时能够撤销这些修改。在MVCC中,UNDO日志用于保存旧版本的数据,以便事务可以读取到之前的数据版本。
3. Read View(读视图)
Read View是MVCC机制中的一个重要概念,它提供了在给定时间点上一致的数据视图给读取操作。每个事务在开始执行时会创建自己的Read View,该视图反映了在该事务开始之前数据库的一致状态。Read View记录了在该事务开始之前已经提交的其他事务所做的修改,以及这些修改的版本信息。
MVCC的工作流程
1. 读操作
当事务执行读操作时,MVCC会根据Read View和UNDO日志来确定可以读取的数据版本。如果读取的数据版本在当前事务开始之前已经提交,则该数据版本对当前事务可见;否则,事务将通过UNDO日志找到更早的版本进行读取。
2. 写操作
当事务执行写操作(如插入、更新、删除)时,MVCC会为被修改的数据行创建一个新的版本,并将旧版本标记为不可见。同时,UNDO日志会记录修改前的数据版本,以便在需要回滚时能够撤销修改。
MVCC的优势
1. 提高并发性能
MVCC允许读写操作并发执行,减少了锁冲突和阻塞,从而提高了数据库的吞吐量。
2. 解决事务隔离问题
MVCC可以支持不同的事务隔离级别(如读未提交、读已提交、可重复读和串行化),通过维护数据的多个版本来确保事务的隔离性和一致性。
3. 降低死锁风险
由于MVCC避免了传统锁机制中的显式锁,因此降低了死锁的风险。
总结
事务的MVCC模式是一种高效的并发控制机制,它通过维护数据的多个版本来实现事务的隔离性和一致性。MVCC通过隐藏列字段、UNDO日志和Read View等组件来实现其功能,并具有提高并发性能、解决事务隔离问题和降低死锁风险等优势。在高度并发的数据库环境中,MVCC是一种被广泛采用的并发控制机制。
相关文章:

postgrsql——事务概述
事务概述 事务的特性 原子性(Atomicity): 事务被视为一个整体,其中的操作要么全部执行成功,要么全部不执行,即不存在部分执行的情况。这确保了事务的完整性和一致性。一致性(Consistency&…...

1.Spring Boot 简介(Spring MVC+Mybatis-plus)
文章目录 一,Spring Boot 简介二,搭建springboot项目并整合mybatis-plus框架1.pom导依赖2.添加启动项3.配置文件.yml 三,springboot集成 Spring MVC1.springmvc定义2.应用注解 一,Spring Boot 简介 SpringBoot是Spring的子工程(或…...

《计算机网络》(学习笔记)
目录 一、计算机网络体系结构 1.1 计算机网络概述 1.1.1 计算机网络的概念 1.1.2 计算机网络的组成 1.1.3 计算机网络的功能 1.1.4 电流交换、报文交换和分组交换 1.1.5 计算机网络的分类 1.1.6 计算机网络的性能指标 1.2 计算机网络体系结构与参考模型 1.2.1 计算机…...

指针函数和函数指针
函数名在表达式中应该如何被解读?答:函数名可以在表达式中被解读成“指向该函数的指针”。 函数指针和指针函数有什么区别?答:函数指针是一个指向函数的指针;指针函数是一个返回指针变量的函数。 一个函数能否有时候…...

Elasticsearch跨集群搜索
Elasticsearch(简称ES)是一种基于Lucene的搜索引擎,以其高性能、可扩展性和实时搜索能力而广受欢迎。在大型分布式系统中,跨集群搜索成为了一个重要的需求,它允许用户从多个Elasticsearch集群中联合查询数据࿰…...

基于FPGA的数字信号处理(19)--行波进位加法器
1、10进制加法是如何实现的? 10进制加法是大家在小学就学过的内容,不过在这里我还是帮大家回忆一下。考虑2个2位数的10进制加法,例如:15 28 43,它的运算过程如下: 个位两数相加,结果为5 8 1…...

树莓派下,centos7操作系统, TensorFlow java版实现植物分类功能
在树莓派上运行CentOS 7,并使用TensorFlow Java版本实现植物分类功能可以通过以下步骤实现。以下是详细的指导: 一、安装和设置环境 1. 更新系统并安装基本工具 确保你的CentOS 7系统是最新的,并安装必要的工具: sudo yum update -y sudo yum install -y wget unzip gi…...

开源一个react路由缓存库
Github仓库 背景 产品希望可以像浏览器那样每打开一个路由,会多一个tab,用户可以切换tab访问之前加载过的页面,且不会重新加载。真就产品一句话…… Github上有轮子了吗 Github上开箱即用的轮子是基于react-router-dom V5实现的ÿ…...

go-kratos 学习笔记(7) 服务发现服务间通信grpc调用
服务发现 Registry 接口分为两个,Registrar 为实例注册和反注册,Discovery 为服务实例列表获取 创建一个 Discoverer 服务间的通信使用的grpc,放到data层,实现的是从uses服务调用orders服务 app/users/internal/data.go 加入 New…...

SPSS个人版是什么软件
SPSS是一款数据统计、分析软件,它由IBM公司出品,这款软件平台提供了文本分析、大量的机器学习算法、数据分析模型、高级统计分析功能等,软件易学且功能非常强大,可以使用SPSS制作图表,例如柱状、饼状、折线等图表&…...

Minos 多主机分布式 docker-compose 集群部署
参考 docker-compose搭建多主机分布式minio - 会bk的鱼 - 博客园 (cnblogs.com) 【运维】docker-compose安装minio集群-CSDN博客 Minio 是个基于 Golang 编写的开源对象存储套件,虽然轻量,却拥有着不错的性能 中文地址:MinIO | 用于AI的S3 …...

Unity + Hybridclr + Addressable + 微信小程序 热更新报错
报错时机: Generate All 怎么All 死活就是报错 生成微信小程序,并启动后 报错内容: MissingMethodException:AoT generic method notinstantiated in aot.assembly:Unity.ResourceManager:dll, 原因: Hybridclr 开发文档 解…...

鸿蒙开发—黑马云音乐之Music页面
目录 1.外层容器效果 2.信息区-发光效果 3.信息区-内容布局 4.播放列表布局 5.播放列表动态化 6.模拟器运行并配置权限 效果: 1.外层容器效果 Entry Component export struct MuiscPage {build() {Column() {// 信息区域Column() {}.width(100%)// .backgroun…...

IsaacLab | 如何在Manipulation任务中添加新的目标(target)
如是我闻: 终于让我给摸索出来了,在这里描述一下问题场景。 假使说我们有一个机械臂操作的任务,这样婶的 Isaac Lab | Push 我们想做多目标的任务,这时候需要向环境中添加第二个目标,像这样 Isaac Lab | Add target 那…...

【Python从入门到进阶】61、Pandas中DataFrame对象的操作(二)
接上篇《60、Pandas中DataFrame对象的操作(一)》 上一篇我们讲解了DataFrame对象的简介、基本操作及数据清洗相关的内容。本篇我们来继续讲解DataFrame对象的统计分析、可视化以及数据导出与保存相关内容。 一、DataFrame的统计分析 在数据分析和处理中…...

Linux(虚拟机)的介绍
Linux介绍 常见的操作系统 Windows:微软公司开发的一款桌面操作系统(闭源系统)。版本有dos,win98,win NT,win XP , win7, win vista. win8, win10,win11。服务器操作系统:winserve…...

CSS(九)——CSS 轮廓(outline)
CSS 轮廓(outline) 轮廓(outline)是绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用。 轮廓(outline)属性指定元素轮廓的样式、颜色和宽度。 让我们用一个图来看…...

Unity Timeline:构建复杂动画序列的利器
Unity的Timeline是一个强大的动画工具,它允许开发者创建复杂的动画序列,将动画、音频和事件整合到一个统一的时间轴上。Timeline的可视化编辑界面使得动画制作变得更加直观和灵活。本文将介绍Unity Timeline的基本概念、功能以及如何使用它来实现动画。 …...

C# 与C++ cli
cli CLI(Command Line Interface)是一种通过命令行界面与计算机系统进行交互的方式。它提供了一种以文本形式输入命令和接收系统输出的方法,用于执行各种操作和管理计算机系统。以下是CLI的详细解释: 一、定义与基本概念 定义&…...

Linux文件编程--打开及创建
...

Vue3点击按钮实现跳转页面并携带参数
前提:有完整的路由规则 1.源页面 <template><div><h1>源页面</h1><!--通过js代码跳转--><template #default"scope"><button click"toTargetView(scope.row)">点击跳转携带参数</button><…...

探索Linux-1-虚拟机远程登陆XShell6远程传输文件Xftp6
Linux是什么? Linux是一个开源的操作系统内核,由林纳斯托瓦兹(Linus Torvalds)于1991年首次发布。它基于Unix操作系统,但提供了更多的自由和灵活性。Linux内核是操作系统的核心部分,负责管理系统资源、处理…...

SpringBoot中使用监听器
1.定义一个事件 /*** 定义事件* author hrui* date 2024/7/25 12:46*/ public class CustomEvent extends ApplicationEvent {private String message;public CustomEvent(Object source, String message) {super(source);this.message message;}public String getMessage() …...

mybatise全接触-面试宝典-知识大全
1 . 简述什么是Mybatis和原理 ? Mybatis工作原理: (1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,加载驱动、创建连接、创建statement等繁杂的过程,开发者…...

Catalyst优化器:让你的Spark SQL查询提速10倍
目录 1 逻辑优化阶段 2.1 逻辑计划解析 2.2 逻辑计划优化 2.2.1 Catalys的优化过程 2.2.2 Cache Manager优化 2 物理优化阶段 2.1 优化 Spark Plan 2.1.1 Catalyst 的 Join 策略 2.1.2 如何决定选择哪一种 Join 策略 2.2 Physical Plan 2.2.1 EnsureRequirements 规则 3 相关文…...

【Hot100】LeetCode—416. 分割等和子集
目录 题目1- 思路2- 实现⭐152. 乘积最大子数组——题解思路 3- ACM 实现 题目 原题连接:416. 分割等和子集 1- 思路 理解为背包问题 思路: 能否将均分的子集理解为一个背包,比如对于 [1,5,11,5],判断能否凑齐背包为 11 的容量…...

前端开发知识-vue
大括号里边放键值对,即是一个对象。 一、vue可以简化前端javascript的操作。 主要特点是可以实现视图、数据的双向绑定。 使用vue主要分为三个步骤: 1.javascript中引入vue.js 可以src中可以是vue的网址,也可以是本地下载。 2.在javasc…...

【嵌入式硬件】快衰减和慢衰减
1.引语 在使用直流有刷电机驱动芯片A4950时,这款芯片采用的是PWM控制方式,我发现他的正转、反转有两种控制方式,分别是快衰减和慢衰减。 2.理解 慢衰减:相当于加在电机(感性原件)两端电压消失,将电机两端正负短接。 快衰减:相当于加在电机(感性原件)两端电压消失,将电机…...

C语言 | Leetcode C语言题解之第275题H指数II
题目: 题解: int hIndex(int* citations, int citationsSize) {int left 0, right citationsSize - 1;while (left < right) {int mid left (right - left) / 2;if (citations[mid] > citationsSize - mid) {right mid - 1;} else {left mi…...

速盾:网络安全和 CDN 之间的关系是怎样的?
网络安全和内容交付网络(CDN)之间有着密切的关系。网络安全主要涉及保护网络和系统免受各种威胁和攻击,而CDN是一种用于提供更快速、高效和可靠的内容交付服务的技术。在当今数字化和云计算时代,网络安全和CDN之间的关系变得更加紧…...