推荐答案
在 PostgreSQL 中,BEGIN、COMMIT 和 ROLLBACK 是用于管理事务的关键字。事务是一组 SQL 语句的集合,这些语句要么全部成功执行,要么全部失败回滚。以下是它们的基本用法:
- BEGIN: 用于启动一个新的事务。
- COMMIT: 用于提交事务,使事务中的所有操作永久生效。
- ROLLBACK: 用于回滚事务,撤销事务中的所有操作。
示例代码
// www.javascriptcn.com code example BEGIN; -- 开始事务 -- 执行一些 SQL 操作 UPDATE accounts SET balance = balance - 100 WHERE user_id = 1; UPDATE accounts SET balance = balance + 100 WHERE user_id = 2; -- 如果一切正常,提交事务 COMMIT; -- 如果发生错误,回滚事务 ROLLBACK;
本题详细解读
1. BEGIN 语句
BEGIN 语句用于启动一个新的事务。在事务开始后,所有的 SQL 操作都会被视为一个整体,直到事务被提交或回滚。
BEGIN;
2. COMMIT 语句
COMMIT 语句用于提交事务。提交后,事务中的所有操作将永久生效,数据将被写入数据库。
COMMIT;
3. ROLLBACK 语句
ROLLBACK 语句用于回滚事务。如果在事务执行过程中发生错误,或者你决定撤销事务中的所有操作,可以使用 ROLLBACK 语句。回滚后,事务中的所有操作将被撤销,数据库将恢复到事务开始前的状态。
ROLLBACK;
4. 事务的 ACID 特性
事务在 PostgreSQL 中遵循 ACID 特性:
- 原子性 (Atomicity): 事务中的所有操作要么全部成功,要么全部失败。
- 一致性 (Consistency): 事务执行前后,数据库的状态必须保持一致。
- 隔离性 (Isolation): 多个事务并发执行时,每个事务都感觉不到其他事务的存在。
- 持久性 (Durability): 一旦事务提交,其结果将永久保存在数据库中。
5. 自动提交模式
在 PostgreSQL 中,默认情况下,每条 SQL 语句都会自动提交。如果你希望手动控制事务,可以使用 BEGIN 语句显式地启动事务。
-- 关闭自动提交
SET AUTOCOMMIT = OFF;
-- 现在每条 SQL 语句都需要显式提交
BEGIN;
INSERT INTO users (name) VALUES ('Alice');
COMMIT;6. 嵌套事务
PostgreSQL 不支持真正的嵌套事务,但你可以使用 SAVEPOINT 来实现类似的功能。
// www.javascriptcn.com code example
BEGIN;
INSERT INTO users (name) VALUES ('Bob');
SAVEPOINT my_savepoint;
INSERT INTO users (name) VALUES ('Charlie');
-- 回滚到保存点
ROLLBACK TO my_savepoint;
COMMIT;在这个例子中,ROLLBACK TO my_savepoint 会撤销插入 Charlie 的操作,但保留插入 Bob 的操作。