在本文中,我们将回答所有这些问题以及更多问题,以帮助您开始使用 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_character和skill_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例如,您可以测试语句以查看它在实践中是否有效。为此,您可以使用事务来包装语句UPDATE和SELECT查询(以测试更新),然后立即可靠地将其回滚。
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认证