数据库管理系统(DBMS)的事务管理:COMMIT 和 ROLLBACK

DBMS 提供了一项特殊功能,可以撤销单个或多个连续的写入和删除操作。这是通过 ROLLBACK 命令实现的。在修改数据时,DBMS 首先将新增、修改或删除的数据写入一个临时空间。在此阶段,这些修改并未成为数据库的“正式”部分。如果确认这些修改需要永久保存,可以使用 COMMIT 命令;如果想撤销这些更改,可以使用 ROLLBACK 命令。所有这些操作都被视为一个事务的一部分。


COMMIT 和 ROLLBACK 的语法

COMMIT WORK;     -- 提交自上次 COMMIT 或 ROLLBACK 以来的所有 INSERTUPDATEDELETE 操作
ROLLBACK WORK;   -- 撤销自上次 COMMIT 或 ROLLBACK 以来的所有 INSERTUPDATEDELETE 操作

注意WORK 是可选的。


关闭 AUTOCOMMIT

某些 DBMS 默认启用了 AUTOCOMMIT 功能,这会在每次写操作(INSERTUPDATEDELETE)后自动执行 COMMIT。虽然这不是 SQL 标准的一部分,但在某些实现中是默认行为。如果需要使用 ROLLBACK 命令,必须先关闭 AUTOCOMMIT

关闭 AUTOCOMMIT 的方法可能包括以下命令,或者在 GUI 中通过点击某些按钮:

SET autocommit = 0;
SET autocommit OFF;

使用 COMMIT 测试插入和删除

插入新行并提交

-- 插入一位新用户
INSERT INTO person (id, firstname, lastname, date_of_birth, place_of_birth, ssn, weight)
VALUES             (99, 'Harriet', 'Flint', DATE'1970-10-19', 'Dallas', '078-05-1120', 65);

-- 确认插入是否成功(期望有一条记录)
SELECT * FROM person WHERE id = 99;

-- 提交更改
COMMIT;

-- 再次确认记录是否仍然存在(期望有一条记录)
SELECT * FROM person WHERE id = 99;

删除行并提交

-- 删除用户
DELETE FROM person WHERE id = 99;

-- 确认删除是否成功(期望无记录)
SELECT * FROM person WHERE id = 99;

-- 提交更改
COMMIT;

-- 再次确认记录是否被删除(期望无记录)
SELECT * FROM person WHERE id = 99;

使用 ROLLBACK 恢复更改

恢复单行记录

-- 删除示例数据中的 Lisa Hamilton
DELETE FROM person WHERE id = 3;

-- 确认删除(期望无记录)
SELECT * FROM person WHERE id = 3;

-- 使用 ROLLBACK 恢复删除
ROLLBACK;

-- 确认记录是否恢复(期望有一条记录)
SELECT * FROM person WHERE id = 3;

恢复多行记录和不同表的更改

-- 删除 Lisa Hamilton
DELETE FROM person WHERE id = 3;

-- 修改所有 email 类型的联系方式
UPDATE contact SET contact_value = 'unknown' WHERE contact_type = 'email';

-- 验证更改
SELECT * FROM person;
SELECT * FROM contact;

-- 使用 ROLLBACK 恢复所有更改
ROLLBACK;

-- 验证是否恢复
SELECT * FROM person;
SELECT * FROM contact;

总结

  1. COMMIT 用于永久保存事务中的更改。
  2. ROLLBACK 用于撤销事务中的更改。
  3. AUTOCOMMIT 默认开启时,需手动关闭以便使用事务管理。
  4. ROLLBACK 可恢复多个表中的更改,适用于复杂事务场景。

通过以上示例,我们可以看到事务管理是确保数据一致性的重要手段。

Last modified: Tuesday, 28 January 2025, 1:43 PM