当前位置: 首页 > article >正文

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

在本文中,我们将回答所有这些问题以及更多问题,以帮助您开始使用 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 命令连接这两个表。让我们看看如何进行。

SELECT
    player_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;
BEGIN
    SELECT 
        player_money (*) 
    INTO 
        count1 
    FROM 
        player_character 
    WHERE 
        user_id = $(user_id );
    SELECT 
        price 
    INTO 
        maxct 
    FROM 
        items 
    WHERE 
        id = $(itemID);
    IF(count1 >= maxCount) THEN
        BEGIN;
            INSERT INTO users (user_id, ...) 
            VALUES (...)
            SET ct = ct - maxct
        COMMIT;
    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.kler.cn/a/503154.html

相关文章:

  • 【C++boost::asio网络编程】使用asio协程搭建异步echo服务器的笔记
  • JVM虚拟机的组成 笼统理解 六大部分 类加载子系统 运行时数据区 执行引擎 本地接口 垃圾回收器 线程工具
  • excel实现下拉单选
  • 服务器中常见的流量攻击类型包括哪些?
  • 开源安防软件ClamAV —— 筑梦之路
  • [c语言日寄]c语言也有“回”字的多种写法——整数交换的三种方式
  • Linux探秘坊-------1.系统核心的低语:基础指令的奥秘解析(3)
  • vscode vue 自动格式化
  • MySQL主从部署(保姆版)
  • 【RabbitMQ】SpringBoot整合RabbitMQ实例
  • C++(类和对象)
  • 生成式数据增强在大语言模型中的应用与实践
  • UE5.4运行报错解决(关于osg使用-无法解决的外部命令)(未解决)
  • 优秀持久层框架——MyBatis
  • 两分钟解决 :![rejected] master -> master (fetch first) , 无法正常push到远端库
  • Chromium 中的 WebUI
  • Springboot内置Apache Tomcat 安全漏洞(CVE-2024-50379)
  • vue2修改表单只提交被修改的数据的字段传给后端接口
  • JavaScript:简介
  • 春秋云镜——initial