📜  postgresql 事务 - SQL (1)

📅  最后修改于: 2023-12-03 14:45:35.575000             🧑  作者: Mango

PostgreSQL 事务 - SQL

PostgreSQL是一种关系型数据库管理系统,支持SQL标准。它具有高度可靠性、可扩展性、安全性和数据完整性。数据库事务是一个执行单元,其中包含一组SQL语句,在不满足ACID特性和其他数据完整性问题的情况下,它可以被看作是执行无效操作的单元。

事务的ACID特性
  • 原子性(Atomicity):所有操作都是原子的,要么全部完成,要么全部回滚。针对PostgreSQL的SQL语句,可以使用BEGIN、ROLLBACK和COMMIT关键字来执行事务。

  • 一致性(Consistency ):事务的执行结果必须使得所有相关的数据完整性约束得到满足。当提交事务时,所有已执行的操作必须保持数据的一致性。

  • 隔离性(Isolation):事务的执行必须是独立的,一个事务的执行不能受到其他并发执行事务的干扰。对于PostgreSQL,它提供了4个隔离级别。

  • 持久性(Durability):事务提交后,它所做的修改将会永久保存在数据库中。如果数据库发生故障,它也可以通过日志恢复数据。

PostgreSQL 事务的语法

PostgreSQL中的事务使用BEGIN...COMMIT和ROLLBACK关键字进行控制。使用BEGIN关键字来开始一个事务,COMMIT用来标记事务的结束点,任何在COMMIT之前的语句都必须保证被执行。如果在事务执行的过程中发生错误,则使用ROLLBACK回滚事务。

BEGIN;
-- 执行事务中的SQL语句
COMMIT;

在事务中,可以执行任意数量及任意类型的SQL语句,包括SELECT、INSERT、UPDATE、DELETE、CREATE、ALTER、DROP及TRUNCATE。

事务的隔离级别

PostgreSQL支持4个事务的隔离级别:

  • Read Uncommitted:一个事务可以看到未提交事务的修改。

  • Read Committed:一个事务只可以看到已经提交事务的修改。

  • Repeatable Read:一个事务读取的数据是基于同一个时间点的,不会看到其他事务对数据的修改。在该级别下,SELECT出来的数据是一个快照,并且不受其他事务修改的影响。如果该级别标记为SERIALIZABLE,则可以减少读写冲突,但需要付出更高的代价。

  • Serializable:最高级别的隔离级别,可以防止最常见的读写冲突。这种隔离级别发生在一个读操作时,修改数据时候会进行锁定。

可以通过SET TRANSACTION ISOLATION LEVEL语句设置事务的隔离级别,如下所示:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
事务的锁机制

PostgreSQL支持共享锁(shared lock)和排它锁(exclusive lock)两种锁机制。

  • 共享锁(Shared Lock):多个事务都可以以共享模式持有一个对象的共享锁。共享锁用于防止其他事务修改共享资源。

  • 排它锁(Exclusive Lock):一个事务只能持有一个对象的排它锁。排它锁防止其他事务并发地访问同一个资源。

可以使用SELECT FOR UPDATE语句获取排它锁,如下所示:

BEGIN;
SELECT * FROM table_a WHERE id = 1 FOR UPDATE;
-- 需要进行更新或删除操作
COMMIT;
总结

PostgreSQL的事务支持ACID特性和隔离级别。数据库事务可以确保数据的完整性和一致性,并保证多个用户之间对数据库的操作不会产生冲突。通过以上对PostgreSQL事务的介绍,可以更好地利用数据库事务来控制和管理数据的修改。