【PGCCC】PostgreSQL 事务及其使用方法

embedded/2025/1/14 10:37:12/

在本文中,我们将回答所有这些问题以及更多问题,以帮助您开始使用 PostgreSQL 事务和实施。

什么是交易?

简单来说,事务就是对数据库中任何更改的传播。假设您向数据库添加了一个新元素 — 这是事务的一个例子。事务不一定只是单一更改,而是可以包含一个或多个操作。在实际应用中,事务通常是各种数据库操作的组合。

关于 PostgreSQL 事务,需要注意的重要一点是它们符合ACID标准。这意味着它们是一致的、原子的、持久的和隔离的。事务是一致的,因为更改会同时传播到整个数据库 - 换句话说,不会有任何差异。它们是任何数据库的最基本单元,因此是原子的。如果您想了解有关符合 ACID 的含义以及其他类型的合规性的更多信息,请查看这篇文章。

PostgreSQL 事务也是隔离的。如果一个事务由于某种原因失败,数据库不会受到影响,其他事务仍可继续进行。这意味着它们也非常耐用和可靠。

数据库管理员为何使用事务

事务的主要卖点是易于处理。许多数据库管理员使用事务来充分利用数据库的各种功能。事务还可以通过自动执行部分或大部分工作来简化许多任务。

事务还增加了一层保护,可以防止简单的错误导致灾难性的故障。DBA 未能使用事务并丢失关键数据的情况有很多。一个值得注意的例子是Microsoft Sidekick 事件。Sidekick 的第三方提供商之一忽略了使用事务建立适当的备份架构,最终导致这些设备上的所有数据永远丢失。通过使用数据库事务设置适当的备份流程,可以避免 Sidekick 事件。

另一个可以使用事务避免的数据丢失事件是AMAG Pharmaceuticals 数据丢失事件。AMAG Pharmaceuticals 的数据库管理员在其中一个文件停止与文件夹同步后丢失了 HR 数据。结果,其他文件也开始从文件夹中消失。尽管该公司能够从备份中检索丢失的数据,但这是一笔不必要的成本,通过遵循正确的事务流程可以轻松避免。

使用事务的优点

在任何数据库网络中使用事务都有几个优点。

串联事件

我们可以使用数据库中的多个事务将一些事件串联在一起。例如,如果我们想为客户填写表格以获取款项设计一个事务,我们可以包含其他几个事件 - 例如发送他们的账户余额、向支付数据库发送请求,然后向客户付款。

本地管理员唯一需要跟踪的是初始请求和响应,因为大多数其他内容都由后台事务处理。

灵活性

灵活性是数据库事务的另一个主要优势。使用事务允许我们在不访问敏感信息的情况下更改数据库中的值 - 这是企业员工数据库的完美用例。在这些数据库中,用户只能访问或更改其信息,而无需知道任何敏感详细信息,例如数据库密码或服务器地址。

避免数据丢失

数据丢失在现实世界中极为常见,每天有数百万人因技术困难或故障而丢失数据。我们上面提到,事务是一致的,因此使用事务数据库将有助于维护数据,而不会因技术错误而导致任何数据丢失。

如果发生断电或系统意外关闭,事务数据库还可以降低丢失任何中间数据的风险。

数据库管理

事务型数据库使许多数据库管理员的工作变得非常简单。大多数事务型数据库不向最终用户提供任何更改事务内数据的方法,因此用户无法更改事务中任何可让他们利用其状态的内容。

在 PostgreSQL 中实现事务

PostgreSQL 中的事务取决于特定事务中表行的哪些版本可见。元组可见性也是维护 PostgreSQL 中事务原子性的关键。我们可以通过隐藏事务不应看到的元组来使事务具有原子性。

非覆盖存储也是在 PostgreSQL 中创建事务的关键。如果你还记得的话,事务最重要的事情之一就是一致性。如果我们想保留数据,我们必须维护元组的多个副本。只有当该特定元组长时间没有事务时,我们才能删除该元组。

在 PostgreSQL 中实现事务非常简单,这要归功于多年来的文档和来自全球开发人员的支持。现在,让我们看看如何在 PostgreSQL 中实现事务。

实例

我们将看到两个如何实现事务的示例。按照以下步骤开始在Arctype中使用 PostgreSQL 。

首先,使用以下命令创建一个 PostgreSQL 数据库
createdb -U postgres MyDB
上述命令以超级用户身份创建了一个名为“MyDB”的数据库。稍后您需要使用此用户的密码。如果您在安装过程中未进行任何更改,则数据库将在默认端口 5432 上启动并运行。

现在,我们可以开始配置数据库了。在这个例子中,我们将制作一个包含两个表的简单 MMORPG 风格数据库——player_characterskill_table。玩家表将包含所有玩家的列表以及各种元素,如级别、名称等。技能表将包含游戏中的所有技能。每个玩家可以拥有多种技能。

我们可以使用以下命令创建该表:

CREATE TABLE [IF NOT EXISTS] player_character( user_id serial PRIMARY KEY,player_name VARCHAR ( 50 ) UNIQUE NOT NULL,player_type VARCHAR ( 50 ) NOT NULL,player_level INT( 255 ) NOT NULL,player_skill VARCHAR(255) NOT NULL,player_money INT
)

现在,我们创建了一个玩家角色表,其中包含 ID、名称、玩家类型和玩家等级。约束NOT NULL告诉数据库该字段不能为空。UNIQUE约束告诉数据库此字段对于所有玩家都应该是唯一的。约束PRIMARY KEY表明 ID 将是表的主要标识符。

现在,让我们继续在技能表中创建三项技能。

CREATE TABLE [IF NOT EXISTS] skill_table(skill_id serial PRIMARY KEY,skill_name VARCHAR ( 50 ) UNIQUE NOT NULL,skill_type VARCHAR ( 50 ) NOT NULL,
)

现在,我们必须使用 PostgreSQL join 命令连接这两个表。让我们看看如何进行。

SELECTplayer_skill,skill_name
FROM player_character
INNER JOIN skill_table ON player_skill = skill_name

SELECT命令选择两个表中提到的列。然后,我们使用FROM and INNER JOIN命令实际链接这两个值。如果的值skill_name发生变化,则的值player_skill也会发生变化。

使用 COMMIT 完成更改

现在我们已经了解了基础知识,让我们创建一个简单的交易。为此,我们将从 Item 表开始。

CREATE TABLE [IF NOT EXISTS] items(id serial PRIMARY KEY,item_name VARCHAR ( 50 ) UNIQUE NOT NULL,price INT( 50 ) NOT NULL,
)
DECLARE ct, maxct INT;
BEGINSELECT player_money (*) INTO count1 FROM player_character WHERE user_id = $(user_id );SELECT price INTO maxct FROM items WHERE id = $(itemID);IF(count1 >= maxCount) THENBEGIN;INSERT INTO users (user_id, ...) VALUES (...)SET ct = ct - maxctCOMMIT;END IF;
END;

仅当用户有能力支付该物品时,上述交易才会将该物品插入用户数据库,然后从用户帐户中扣除款项。

使用 ROLLBACK 测试或撤消更改

事务的另一个重要功能是测试。UPDATE例如,您可以测试语句以查看它在实践中是否有效。为此,您可以使用事务来包装语句UPDATESELECT查询(以测试更新),然后立即可靠地将其回滚。

UPDATE例如,这是对某项特定技能的测试skill_type。

BEGIN;UPDATE skill_table SET skill_type = 'Magic'WHERE skill_name = 'Firebreath';SELECT skill_type FROM skill_table WHERE skill_name = 'Firebreath';
ROLLBACK; -- << Important! This Un-does your UPDATE statement above!

事务通常以提交结束,但由于您只是在测试并且不希望更改是永久性的,因此您只需回滚即可。

结论

事务是 PostgreSQL 和整个数据世界的关键部分。阅读本文后,您现在可以创建事务并以最高效率进行操作。
#PG证书#PG考试#PostgreSQL培训#PostgreSQL考试#PostgreSQL认证


http://www.ppmy.cn/embedded/153814.html

相关文章

xcrun: error: invalid active developer path 解决

在拉取 github 代码时&#xff0c;提示如下报错&#xff1a; xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun 原因是&#xff1a;这是由于 Xcode command line t…

LeetCode:39. 组合总和

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;39. 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 cand…

redis:安装部署、升级以及失败回退

安装部署 一、准备工作 1. 检查系统要求 确保你的服务器满足 Redis 的基本要求: 操作系统:支持的 Linux 发行版(如 Ubuntu, CentOS)内存:至少 4GB(根据实际应用需求调整)CPU:单核或多核 CPU磁盘空间:足够的磁盘空间用于数据存储和日志记录2. 更新系统软件包 在开始…

<C++学习>C++ std 多线程教程

C std 多线程教程 理解多线程的概念 多线程是一种并发编程技术&#xff0c;它允许程序同时运行多个任务。每个线程共享同一进程的资源&#xff08;如内存&#xff09;&#xff0c;但拥有独立的执行路径。多线程编程在现代 C 中变得更加便捷和安全&#xff0c;标准库提供了强大…

卫星电话打通救灾生命线,确保“找得到人、通得上话”

从日喀则地震的救援信息&#xff0c;我们可以发现&#xff0c;应急救援卫星通信设备日益小型化、便携化、集成化&#xff0c;且国产化率大幅提升&#xff0c;与17年前汶川地震救援时所使用的体积庞大、架设复杂的卫星通信设备相比&#xff0c;如今的设备不仅在形态上更为轻巧灵…

【HTML+CSS+JS+VUE】web前端教程-8-标签之文本

常用文本标签 特别提示: 常用文本标签和段落是不同的,段落代表一段文本,而文本标签一般表示文本词汇。 <!DOCTYPE html> <html lang="en"

K8s 集群 IP 地址管理指南(K8s Cluster IP Address Management Guide)

K8s 集群 IP 地址管理指南 概述 你是否在小型初创公司或大型企业工作&#xff0c;并正在为公司评估 Kubernetes&#xff1f;你可能正在考虑运行十几个或更多的 Kubernetes (K8s) 集群。你期望每个集群支持几百个 K8s 节点&#xff0c;每个节点可能有 50 到 100 个 K8s Pod。这…

JVM面试相关

JVM组成 什么是程序计数器 详细介绍Java堆 什么是虚拟机栈 能不能解释一下方法区&#xff1f; 直接内存相关 类加载器 什么是类加载器&#xff0c;类加载器有哪些 什么是双亲委派模型 类加载过程 垃圾回收 对象什么时候可以被垃圾回收器回收 JVM垃圾回收算法有那些 JVM的分代…