postgrsql——事务概述

事务概述

事务的特性

  1. 原子性(Atomicity
    • 事务被视为一个整体,其中的操作要么全部执行成功,要么全部不执行,即不存在部分执行的情况。这确保了事务的完整性和一致性。
  2. 一致性(Consistency
    • 事务在执行前后,数据库的状态必须保持一致。即事务的执行结果必须满足数据库的所有规则和约束,以维护数据的完整性。
  3. 隔离性(Isolation
    • 事务的执行应该相互独立,互不干扰。一个事务的执行结果不应该被其他并发执行的事务所影响,这通过数据库管理系统提供的隔离级别来实现。
  4. 持久性(Durability
    • 一旦事务被提交,其对数据库的修改就是永久性的,即使系统发生故障也不会丢失。这确保了数据的可靠性和稳定性。

事务的作用

  1. 保证数据的一致性
    • 通过事务的原子性特性,确保在一组操作中,要么所有操作都成功执行,要么全部回滚,从而保证数据库的数据一致性。
  2. 确保数据的完整性
    • 事务通过ACID属性(原子性、一致性、隔离性和持久性)来确保数据的完整性,防止数据丢失或损坏。
  3. 提供隔离性
    • 事务的隔离性确保了多个并发事务之间的隔离,避免了数据交叉访问和干扰,保证了每个事务的独立性。
  4. 支持回滚和恢复
    • 在事务执行过程中,如果发生错误或异常情况,可以通过回滚操作将数据库恢复到事务开始前的状态,保证数据的可靠性和稳定性。

综上所述,事务是数据库管理系统中保证数据一致性、完整性和可靠性的重要机制。通过事务的ACID属性,可以确保数据库操作的原子性、一致性、隔离性和持久性,从而满足各种复杂的应用需求。

事务的一致性

事务的一致性(Consistency)是数据库事务管理中一个至关重要的特性,它确保了事务执行前后数据库的状态都满足所有定义的规则和约束。换句话说,一致性要求事务的执行结果必须使数据库从一个一致的状态转换到另一个一致的状态。

在事务的上下文中,一致性通常涉及以下几个方面:

  1. 数据的完整性:事务的执行不能破坏数据库中数据的完整性约束,如主键约束、外键约束、唯一性约束、检查约束等。这些约束用于维护数据的准确性和可靠性。
  2. 业务规则:除了数据库本身的约束外,事务还需要遵守应用程序定义的业务规则。例如,在银行账户转账的场景中,转账事务必须确保转出账户的余额足够,并且在转账后两个账户的余额总和保持不变。
  3. 数据的逻辑一致性:事务的执行结果应该符合数据的逻辑定义和预期的业务逻辑。例如,在库存管理系统中,一个减少库存数量的事务必须确保库存数量不会变为负数。
  4. 数据依赖关系:在复杂的数据关系中,事务的执行可能需要考虑数据之间的依赖关系。一致性要求事务的执行不能破坏这些依赖关系,以保持数据的逻辑一致性。

为了保持事务的一致性,数据库管理系统(DBMS)通常会在事务执行过程中进行一系列的检查和验证。如果事务违反了任何一致性约束或规则,DBMS将拒绝执行该事务或回滚已执行的操作,以恢复数据库到一致的状态。

此外,事务的一致性还与事务的隔离性密切相关。虽然隔离性主要关注事务之间的并发控制,但它也间接地影响了一致性,因为并发事务可能会相互干扰并破坏数据的一致性。因此,数据库系统通过提供不同级别的隔离性来平衡一致性和并发性之间的需求。

总之,事务的一致性是数据库事务管理中不可或缺的特性之一,它确保了事务执行前后数据库状态的一致性和数据的完整性。通过遵守数据库的约束、业务规则和数据依赖关系,事务能够维护数据的逻辑一致性和可靠性。

事务的隔离级别

SHOW TRANSACTION ISOLATION LEVEL;

SELECT current_setting('transaction_isolation');

事务的隔离级别是数据库管理系统(DBMS)中用于处理并发事务时可能发生的各种问题的关键概念。SQL标准定义了四种隔离级别,由低到高依次为:

  1. 读未提交(Read Uncommitted

但在内部,实际上只有三种独立的隔离级别,分别对应读已提交,可重复读和可串行化

    • 这是最低的隔离级别。
    • 在此级别下,一个事务可以读取另一个事务尚未提交的数据修改。
    • 这可能会导致脏读问题,即一个事务读取到了另一个事务尚未提交的数据,而后者可能会在后续被回滚,从而导致读取到的数据实际上是无效的。
    • 由于允许脏读,读未提交的隔离级别无法保证事务的一致性,且通常不推荐在生产环境中使用。
  1. 读已提交(Read Committed
    • 在此级别下,一个事务只能读取到已经提交的数据修改。
    • 这避免了脏读问题,但仍然存在不可重复读的风险,即在同一事务中多次读取同一数据,可能会因为其他事务的提交而导致结果不一致。
    • 读已提交隔离级别提供了一定程度的数据隔离,但无法解决幻读问题。
  2. 可重复读(Repeatable Read
    • 此级别提供了比读已提交更高的隔离性。
    • 在可重复读隔离级别下,一个事务在执行过程中多次读取同一行数据,可以得到一致的结果,即使其他事务对数据进行了修改也不会影响到当前事务的读取结果。
    • 它解决了不可重复读问题,但在某些情况下仍然可能出现幻读,即在同一事务中多次执行相同的查询,但结果集却不一致,通常是由于其他事务插入了符合查询条件的新数据。
    • 需要注意的是,不同的数据库系统(如MySQLInnoDB引擎)可能通过特定的机制(如next-key锁)来进一步解决幻读问题。
  3. 串行化(Serializable
    • 这是最高的隔离级别。
    • 在串行化隔离级别下,事务之间具有完全的隔离性,每个事务都像是在独立的执行环境中执行一样,互不干扰。
    • 它可以完全避免脏读、不可重复读和幻读等并发问题。
    • 但是,由于事务之间需要串行执行,这可能会导致系统性能显著下降,因此在实际应用中需要权衡数据一致性和系统性能的需求。

在实际应用中,选择合适的隔离级别需要根据具体的业务场景和需求来决定。例如,在需要高并发但对数据一致性要求不高的场景下,可以选择较低的隔离级别;而在对数据一致性要求极高的场景下,则可能需要选择更高的隔离级别甚至串行化级别。同时,数据库系统通常也提供了相应的配置选项来允许用户根据需要调整事务的隔离级别。

需要注意的是,虽然SQL标准定义了这四种隔离级别,但不同的数据库系统可能会在实现上有所差异。因此,在使用特定数据库系统时,需要参考该系统的官方文档来了解其事务隔离级别的具体实现和特性。

事务并发mvcc

事务的MVCCMulti-Version Concurrency Control,多版本并发控制)模式是一种用于实现事务隔离性的并发控制机制,常见于许多数据库管理系统(如MySQLInnoDB引擎和PostgreSQL)中。MVCC通过创建数据的多个版本,并为每个事务提供适当的版本来实现并发访问数据而不会相互干扰的目的。以下是关于事务MVCC模式的详细解析:

MVCC的基本概念

1. 定义

MVCC是一种并发控制的方法,用于在数据库管理系统中实现对数据库的并发访问。它通过维护数据的多个版本来避免读写冲突,从而提高数据库的并发性能。

2. 核心思想

MVCC的核心思想是为每个事务创建一个独立的数据视图,该视图反映了在事务开始时数据库的一致状态。每个事务在执行读操作时,只能看到在其开始之前已经提交的版本。

​​​​​​​数据版本

MVCCMulti-Version Concurrency Control,多版本并发控制)是一种在数据库管理系统中实现并发控制的技术,它通过保留数据的多个版本来实现事务的隔离性,从而允许读写操作同时进行,提高数据库的并发性能和响应能力。在MVCC中,数据版本是核心概念之一,具体来说,数据版本指的是数据在特定时间点的状态或记录。

​​​​​​​

数据版本的核心要素

MVCC机制下,数据版本通常包含以下几个关键信息:

  1. 事务IDTransaction ID:标识了生成该数据版本的事务。每当事务对数据进行修改时,都会生成一个新的数据版本,并将该事务的ID与该版本关联起来。
  2. 数据内容:即事务修改后的数据值。每个版本都保存了数据在某一时刻的具体内容。
  3. 版本链信息:在支持MVCC的数据库中,如MySQLInnoDB存储引擎,会通过一种称为版本链的数据结构来管理数据的多个版本。版本链中的每个节点都代表了一个数据版本,通过指针(如roll_ptr)将不同版本的数据连接起来。这样,系统就可以通过遍历版本链来访问数据的不同版本。​​​​​​​​​​​​​​数据版本的生成与管理​​​​​​​
  4. 数据修改时生成新版本:当事务对数据库中的数据进行修改时,MVCC机制会生成一个新的数据版本,并将旧版本的数据保存到undo日志中。新版本的数据会包含事务ID、修改后的数据内容以及指向旧版本的指针(如果适用)。
  5. 版本的选择与可见性:事务在读取数据时,会根据其隔离级别和当前系统的状态来选择合适的数据版本进行读取。例如,在可重复读(Repeatable Read)隔离级别下,事务会读取事务开始时数据库的快照中的数据版本;而在读已提交(Read Committed)隔离级别下,事务会读取最新的已提交事务修改的数据版本。
  6. 垃圾回收:随着时间的推移和事务的不断执行,数据库中会积累大量的旧数据版本。为了节省存储空间并提高性能,MVCC机制会定期执行垃圾回收操作,清理那些不再被任何事务需要的旧版本数据。
        1. 总结

MVCC的数据版本是指数据在特定时间点的状态或记录,它包含了事务ID、数据内容以及版本链信息等关键信息。通过管理数据的多个版本,MVCC机制能够在保证数据一致性的同时提高数据库的并发性能。

      1. Pg数据库的数据版本

PostgreSQL(简称PG)数据库的MVCCMulti-Version Concurrency Control,多版本并发控制)机制中,数据版本是核心概念之一。在PostgreSQL中,数据版本是指数据在特定时间点的状态或记录,这些版本通过一系列的内部机制来管理和维护,以确保事务的隔离性和一致性。

        1. 数据版本的核心要素
  1. 事务IDTransaction IDXID
    • 事务IDPostgreSQL中用于唯一标识事务的标识符。在MVCC中,每个事务在创建时都会被分配一个递增的事务ID
    • 事务ID在数据库中是全局唯一的,并且用于关联每个事务对数据库所做的修改(即数据版本)。
  2. 版本链(Version Chain
    • 对于数据库中的每个数据行,PostgreSQL都会维护一个版本链。这个链表记录了不同事务对该数据行所做的所有修改,每个节点代表一个数据版本。
    • 当数据行被更新时,会创建一个新的数据版本并将其添加到版本链的头部,而旧版本则通过链表结构保留下来。
  3. 可见性规则(Visibility Rules
    • PostgreSQL定义了一套可见性规则,用于确定哪些数据版本对于特定事务是可见的。
    • 这些规则通常基于事务的开始时间戳(即事务ID的创建时间)来判断。一个事务只能看到在其开始时间之前已经提交的事务所创建的数据版本。
数据版本的管理
  • 读取操作
    • 当事务执行读取操作时,PostgreSQL会根据该事务的快照(Snapshot)和可见性规则来确定哪些数据版本是可见的。
    • 快照是在事务开始时创建的,记录了数据库在那一刻的状态。事务在整个执行过程中都会使用这个快照来读取数据。
  • 写入操作
    • 当事务执行写入(包括INSERTUPDATEDELETE)操作时,PostgreSQL不会直接在原始数据上进行修改,而是创建一个新的数据版本。
    • 这个新版本会被添加到相应数据行的版本链中,并更新相关的事务ID和可见性信息。
  • 垃圾回收
    • 随着时间的推移,版本链会变得越来越长,导致性能下降和存储空间浪费。
    • PostgreSQL通过定期执行VACUUM操作来清理不再需要的数据版本(即那些对任何当前或未来事务都不可见的数据版本)。
​​​​​​​总结

PostgreSQLMVCC机制通过事务ID、版本链和可见性规则等核心要素来管理数据版本。这种机制允许多个事务同时读写数据库中的数据,而不会相互干扰,从而提高了数据库的并发性能和响应能力。同时,通过定期的垃圾回收操作,PostgreSQL能够保持数据库的性能和存储效率。

​​​​​​​MVCC的实现原理

1. 隐藏列字段

在支持MVCC的数据库中,每行记录除了用户自定义的字段外,还包含了一些隐藏字段,用于跟踪和管理事务的相关信息。这些字段通常包括事务IDDB_TRX_ID)、回滚指针(DB_ROLL_PTR)、行IDDB_ROW_ID)等。

2. UNDO日志

UNDO日志是数据库系统中的一种日志,用于记录事务所做的修改操作的逆向操作,以便在需要回滚事务或恢复数据时能够撤销这些修改。在MVCC中,UNDO日志用于保存旧版本的数据,以便事务可以读取到之前的数据版本。

3. Read View(读视图)

Read ViewMVCC机制中的一个重要概念,它提供了在给定时间点上一致的数据视图给读取操作。每个事务在开始执行时会创建自己的Read View,该视图反映了在该事务开始之前数据库的一致状态。Read View记录了在该事务开始之前已经提交的其他事务所做的修改,以及这些修改的版本信息。

​​​​​​​MVCC的工作流程

1. 读操作

当事务执行读操作时,MVCC会根据Read ViewUNDO日志来确定可以读取的数据版本。如果读取的数据版本在当前事务开始之前已经提交,则该数据版本对当前事务可见;否则,事务将通过UNDO日志找到更早的版本进行读取。

2. 写操作

当事务执行写操作(如插入、更新、删除)时,MVCC会为被修改的数据行创建一个新的版本,并将旧版本标记为不可见。同时,UNDO日志会记录修改前的数据版本,以便在需要回滚时能够撤销修改。

​​​​​​​MVCC的优势

1. 提高并发性能

MVCC允许读写操作并发执行,减少了锁冲突和阻塞,从而提高了数据库的吞吐量。

2. 解决事务隔离问题

MVCC可以支持不同的事务隔离级别(如读未提交、读已提交、可重复读和串行化),通过维护数据的多个版本来确保事务的隔离性和一致性。

3. 降低死锁风险

由于MVCC避免了传统锁机制中的显式锁,因此降低了死锁的风险。

​​​​​​​总结

事务的MVCC模式是一种高效的并发控制机制,它通过维护数据的多个版本来实现事务的隔离性和一致性。MVCC通过隐藏列字段、UNDO日志和Read View等组件来实现其功能,并具有提高并发性能、解决事务隔离问题和降低死锁风险等优势。在高度并发的数据库环境中,MVCC是一种被广泛采用的并发控制机制。

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

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

相关文章

WATLOW Power Series SSR User’s Manual

WATLOW Power Series SSR User’s Manual

【Java】字符串String类(011)

目录 ♦️API和API帮助文档 ♦️创建String 🎏直接赋值类 🎏new类 🐡空参类 构造方法: 举例代码: 🐡有参类 构造方法: 举例代码: 🐡字符数组类 构造方法&…

【C++】类和对象——流插入和流提取运算符重载

目录 前言ostream和istream自定义类型的流插入重载自定义类型的流提取重载解决私有问题日期类总接口 前言 我们在上一节实现日期类时,在输入和输出打印时,经常会调用两个函数: void Insert()//输入函数{cin >> _year;cin >> _mo…

项目比赛经验分享:如何抓住“黄金一分钟”

项目比赛经验分享:如何抓住“黄金一分钟” 前言引起注意:用事实和故事开场明确痛点:描述问题和影响介绍解决方案:简明扼要激发兴趣:使用视觉辅助概述演讲结构:清晰的路线图我的开场白示例结语 前言 在创新的…

(源码分析)springsecurity认证授权

了解 1. 结构总览 SpringSecurity所解决的问题就是安全访问控制,而安全访问控制功能其实就是对所有进入系统的请求进行拦截,校验每个请求是否能够访问它所期望的资源。 根据前边知识的学习,可以通过Filter或AoP等技术来实现,Spr…

鸿蒙应用框架开发【简单时钟】 UI框架

简单时钟 介绍 本示例通过使用ohos.display接口以及Canvas组件来实现一个简单的时钟应用。 效果预览 使用说明 1.界面通过setInterval实现周期性实时刷新时间,使用Canvas绘制时钟,指针旋转角度通过计算得出。 例如:"2 * Math.PI / …

【PHP】系统的登录和注册

一、为什么要学习系统的登录和注册 系统的登录和注册可能存在多种漏洞,这些漏洞可能被恶意攻击者利用,从而对用户的安全和隐私构成威胁。通过学习系统的登录和注册理解整个登录和注册的逻辑方便后续更好站在开发的角度思考问题发现漏洞。以下是一些常见…

BUGKU-WEB-好像需要密码

如果点击start attrack 后出现 Payload set 1: Invalid number settings 的提示,先点hex 后点 decimal 再开始start attrack,这是一个软件bug,需要手动让它刷新。 解题思路 先随便输入测试:admin看看源码吧那就爆破了 据说&…

WEBKIT 通过JavaScript 调用本地,硬件未来之窗OS硬件APP

以酒店为例我们需要调用shen份证读取,采集人脸,门锁写房卡,如何通过浏览器调用 1.通过本地http服务 2.通过webkit模式 这里说政务单位模式的集成 由于篇幅问题,怎么集成webkit就不说了 一、webkkit加载交互本地代码 browser.…

旅游卡,免费,旅游是真的吗?真相是……

但这种包来回大交通,一旦成本大于利润,他们就会以各种理由推卸责任。这就是我在“揭秘:共享旅游卡免费旅游,包来回路费,这背后的3大真相!”这篇文章里面讲到那个大妈的惨痛教训。 以上这5点真相&#xff0…

大数据学习之Flink基础(补充)

Flink基础 1、系统时间与事件时间 系统时间(处理时间) 在Sparksreaming的任务计算时,使用的是系统时间。 假设所用窗口为滚动窗口,大小为5分钟。那么每五分钟,都会对接收的数据进行提交任务. 但是,这里有…

Redis高可用之持久化,以及reids的性能管理

一、redis高可用: 在集群当中有一个非常重要的指标,提供正常服务的时间的百分比(365天)99.9% redis的高可用含义更加宽泛,正常服务是指标之一,数据容量的扩展,数据的安全性 在redis中实现高可…

平移、旋转、缩放和媒体

一、平移 1.1translate()函数 做转换工作可以用translate()函数,这个函数可以改变坐标系。通过改变默认的坐标系,我们可以创建不同的转换方式,包括平移、旋转和缩放。 1.2平移位置案例 案例代码如图1 图1 保存运行如…

Flutter——全网最精致木鱼APP可上架应用市场

研发背景 工作之余,闲来无事,想着研发一款用户可能会经常用到的一款APP,并且能够顺便掌握一下Flutter Material Design 3 UI,所以就有了这款比较精致的木鱼APP的诞生。 开源代码 https://github.com/z244370114/woodenfish

期刊评价指标及其查询方法

1、期刊评价体系一 科睿唯安《期刊引证报告》(Journal Citation Reports, JCR) 科睿唯安每年发布的《期刊引证报告》(Journal Citation Reports, JCR)是一个独特的多学科期刊评价工具。JCR数据库提供基于引文数据的统计信息的期…

Linux下文件编译器-GCC/G++

前言 本文介绍了c/c的编译过程以及gcc/g的时使用 一.c/c翻译的本质:将高级语言翻译成二进制 1)程序翻译过程: (1)预处理(头文件展开、宏替换、去注释、条件编译)还是C语言代码 ​ …

项目:基于gRPC进行项目的微服务架构改造

文章目录 写在前面基本使用封装客户端封装服务端Zookeeper 写在前面 最近学了一下gRPC进行远程调用的原理,所以把这个项目改造成了微服务分布式的架构,今天也是基本实现好了,代码已提交 这里补充一下文档吧,也算记录一下整个过程…

Ruoyi 快速开发平台

Ruoyi 快速开发平台 一、官网二、准备工作2.1 环境要求2.2 必要配置 三、运行系统3.1 后端运行3.2 前端安装及运行 四、自定义开发4.1 新增业务模块4.2 代码生成4.2.1 创建菜单4.2.2 后端代码4.2.3 前端代码 一、官网 链接: 前后端分离版本 回到目录 二、准备工作 2.1 环境要…

【C语言】链式队列的实现

队列基本概念 首先我们要了解什么是队列,队列里面包含什么。 队列是线性表的一种是一种先进先出(First In Fi Out)的数据结构。在需要排队的场景下有很强的应用性。有数组队列也有链式队列,数组实现的队列时间复杂度太大&#x…

【数据结构】链式二叉树的实现和思路分析及二叉树OJ

【数据结构】链式二叉树的实现和思路分析及二叉树OJ 🔥个人主页:大白的编程日记 🔥专栏:数据结构 文章目录 【数据结构】链式二叉树的实现和思路分析及二叉树OJ前言一.链式二叉树的定义及结构二.链式二叉树的遍历2.1前序遍历2.2中…