【学习笔记】PostgreSQL之事务

本文介绍了PostgreSQL中的事务处理机制,包括原子性、一致性、隔离性和持久性原则,展示了如何使用BEGIN,COMMIT,ROLLBACK以及保存点进行操作,并强调了事务在维护数据库一致性的重要性。
摘要由CSDN通过智能技术生成

事务是所有数据库系统的基础概念。事务最重要的一点是它将多个步骤捆绑成了一个单一的、要么全完成要么全不完成的操作。步骤之间的中间状态对于其他并发事务是不可见的,并且如果有某些错误发生导致事务不能完成,则其中任何一个步骤都不会对数据库造成影响。

在 PostgreSQL 中,事务是一组 SQL 操作的执行单元,可以以原子、一致、隔离和持久(ACID)的方式处理数据。这意味着事务是数据库操作的基本单位,要么全部成功执行,要么全部回滚到事务开始前的状态,以确保数据的一致性和完整性。

  1. 原子性(Atomicity):事务被视为一个不可分割的操作单元。如果事务中的任何一部分操作失败,整个事务将被回滚,数据库状态将恢复到事务开始前的状态。

  2. 一致性(Consistency):事务必须使数据库从一个一致的状态转移到另一个一致的状态。这意味着事务应遵循数据库的完整性约束,如外键、唯一键等。

  3. 隔离性(Isolation):事务的执行是相互隔离的,即使多个事务同时运行,也不会相互影响。PostgreSQL 提供不同级别的隔离,如读取未提交数据(Read Uncommitted)、读取已提交数据(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。

  4. 持久性(Durability):一旦事务提交,其结果将永久保存在数据库中,即使系统崩溃或重新启动,数据也不会丢失。

在 PostgreSQL 中,可以使用 BEGINSTART TRANSACTION 来启动一个事务,然后使用 COMMIT 提交事务或 ROLLBACK 回滚事务。示例:

-- 启动事务
BEGIN;

-- 执行一系列 SQL 操作

-- 提交事务
COMMIT;

-- 或者回滚事务
ROLLBACK;

例如,考虑一个保存着多个客户账户余额和支行总存款额的银行数据库。假设我们希望记录
一笔从Alice的账户到Bob的账户的额度为100.00美元的转账。在最大程度地简化后,涉及到
的SQL命令是:

BEGIN; -- 开启事务
-- 从Alice的账户余额中减去100元
UPDATE accounts SET balance = balance - 100.00 WHERE name = 'Alice';
-- 从Alice的支行总额中减去100元
UPDATE branches SET balance = balance - 100.00 WHERE name = (SELECT branch_name FROM accounts WHERE name = 'Alice');
-- 给Bob的账户加上100元
UPDATE accounts SET balance = balance + 100.00 WHERE name = 'Bob';
-- 给Bob的支行账户加上100元
UPDATE branches SET balance = balance + 100.00 WHERE name = (SELECT branch_name FROM accounts WHERE name = 'Bob');
COMMIT;-- 提交事务

也可以利用保存点来以更细的粒度来控制一个事务中的语句。保存点允许我们有选择性地放弃事务的一部分而提交剩下的部分。在使用SAVEPOINT定义一个保存点后,我们可以在必要时利用ROLLBACK TO回滚到该保存点。该事务中位于保存点回滚点之间的数据库修改都会被放弃,但是早于该保存点的修改则会被保存。

比如,假设我们从Alice的账户扣款100美元,然后存款到Bob的账户,结果直到最后才发现我们应该存到Wally的账户。我们可以通过使用保存点来做这件事:

BEGIN;
UPDATE accounts SET balance = balance - 100.00 WHERE name = 'Alice';
SAVEPOINT my_savepoint; -- 定义保存点
UPDATE accounts SET balance = balance + 100.00 WHERE name = 'Bob';
-- 此时我们记起来需要转给的人是Wally
ROLLBACK TO my_savepoint; -- 回滚到保存点的位置
UPDATE accounts SET balance = balance + 100.00 WHERE name = 'Wally';
COMMIT;

在回滚到保存点之后,它的定义依然存在,因此我们可以多次回滚到它。反过来,如果确定不再需要回滚到特定的保存点,它可以被释放以便系统释放一些资源。不管是释放保存点还是回滚到保存点都会释放定义在该保存点之后的所有其他保存点

所有这些都发生在一个事务块内,因此这些对于其他数据库会话都不可见。当提交整个事务块时,被提交的动作将作为一个单元变得对其他会话可见,而被回滚的动作则永远不会变得可见。

事务也可以嵌套,这允许你在其他事务内启动新事务。在这种情况下,内部事务只有在外部事务成功提交时才会生效。如果外部事务回滚,所有嵌套事务都将回滚。

事务的使用对于确保数据的一致性和完整性非常重要。在应用程序中,通常将相关操作组合成一个事务,以确保在发生错误或异常情况下可以回滚到安全状态,从而保护数据。

好的,我可以和你分享一些关于 PostgreSQL学习笔记。 1. PostgreSQL 是什么? PostgreSQL 是一种开源的关系型数据库管理系统,它支持 SQL 语言和 ACID 事务处理,并且具有丰富的特性和扩展性,可用于大型企业应用、Web 应用和嵌入式应用。 2. PostgreSQL 的特点 PostgreSQL 具有以下特点: - 开源免费 - 支持 ACID 事务处理 - 支持 SQL 语言 - 支持复杂查询和数据类型 - 支持存储过程和触发器 - 可以扩展和定制 - 可以跨平台运行 3. PostgreSQL 的安装 在 Windows 平台下,可以从官网下载 Windows 安装程序进行安装。在 Linux 平台下,可以使用包管理器安装,例如 Ubuntu 可以使用以下命令进行安装: ``` sudo apt-get install postgresql ``` 4. PostgreSQL 的基本操作 创建数据库: ``` CREATE DATABASE databasename; ``` 创建表: ``` CREATE TABLE tablename ( column1 datatype, column2 datatype, column3 datatype, .... ); ``` 插入数据: ``` INSERT INTO tablename (column1, column2, column3, ...) VALUES (value1, value2, value3, ...); ``` 查询数据: ``` SELECT column1, column2, ... FROM tablename WHERE condition; ``` 更新数据: ``` UPDATE tablename SET column1 = value1, column2 = value2, ... WHERE condition; ``` 删除数据: ``` DELETE FROM tablename WHERE condition; ``` 5. PostgreSQL 的扩展 PostgreSQL 可以通过扩展来增强其功能,例如: - PostGIS:空间数据处理扩展 - PL/Python:Python 语言扩展 - pgAdmin:可视化管理工具 - pgpool-II:连接池和负载均衡工具 以上就是一些关于 PostgreSQL 的基本学习笔记,希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值