事务(Transaction)是数据库管理系统中的一个重要概念,用于确保数据的一致性和完整性。事务是一组操作的集合,这些操作要么全部成功执行,要么全部不执行。本文将介绍 MySQL 和 PostgreSQL 中的事务控制机制,包括基本概念、事务控制语句以及具体的实现。
事务的基本概念
事务的特性(ACID)
事务具有四个基本特性,通常称为 ACID 特性
- 原子性(Atomicity):事务是一个不可分割的工作单位,事务中的所有操作要么全部完成,要么全部不完成。
- 一致性(Consistency):事务必须使数据库从一个一致性状态转换到另一个一致性状态。
- 隔离性(Isolation):事务的执行不受其他事务的干扰,事务之间是隔离的。
- 持久性(Durability):事务一旦提交,其对数据库的更改就是永久的,即使系统发生故障也不会丢失。
事务的状态
事务在执行过程中可以处于以下几种状态:
- 活跃(Active):事务正在执行。
- 部分提交(Partially Committed):事务的所有操作已经完成,但尚未提交。
- 失败(Failed):事务在执行过程中遇到错误,需要回滚。
- 中止(Aborted):事务已回滚,恢复到初始状态。
- 提交(Committed):事务已成功提交,更改永久保存。
事务控制语句
开始事务
MySQL:START TRANSACTION;
PostGreSQL:BEGIN;
提交事务
MySQL、PostgreSQL: COMMIT;
回滚事务
MySQL、PostgreSQL: ROLLBACK;
保存点
MySQL:
SAVEPOINT savepoint_name;
ROLLBACK TO SAVEPOINT savepoint_name;
RELEASE SAVEPOINT savepoint_name;
PostgreSQL:
SAVEPOINT savepoint_name;
ROLLBACK TO SAVEPOINT savepoint_name;
RELEASE SAVEPOINT savepoint_name;
使用事务注意事项
在数据库事务中,不是所有的SQL语句都可以放在事务中执行。某些类型的语句由于其特性和数据库系统的实现方式,不能或不应该放在事务中。以下是一些常见的不能放在事务中执行的SQL语句类型:
数据定义语言(DDL)语句
大多数DDL语句(Data Definition Language)会隐式地提交当前事务。这些语句通常用于定义或修改数据库结构,如创建、修改或删除表、索引、视图等。常见的DDL语句包括:
- CREATE TABLE
- DROP TABLE
- ALTER TABLE
- CREATE INDEX
- DROP INDEX
- CREATE VIEW
- DROP VIEW
数据控制语言(DCL)语句
数据控制语言(Data Control Language)语句用于控制用户对数据库的访问权限,如授予或撤销权限。这些语句通常也会隐式地提交当前事务。常见的DCL语句包括:
- GRANT
- REVOKE
事务控制语句
事务控制语句本身不能嵌套在事务中。这些语句用于显式地控制事务的开始、提交和回滚。常见的事务控制语句包括:
- START TRANSACTION / BEGIN
- COMMIT
- ROLLBACK
- SAVEPOINT
- RELEASE SAVEPOINT
- ROLLBACK TO SAVEPOINT
其他特殊语句
某些特定的SQL语句或命令也可能不能放在事务中执行,具体取决于数据库系统的实现。例如:
- VACUUM(PostgreSQL)
- ANALYZE(PostgreSQL)
- CHECKPOINT(PostgreSQL)
- DROP_DATABASE( PostgreSQL )
- CREATE_DATABASE( PostgreSQL )
- SHOW(MySQL)
数据库引擎特定的限制
不同的数据库管理系统可能有不同的限制。例如,MySQL 的 InnoDB 存储引擎支持事务,而 MyISAM 存储引擎不支持事务。因此,使用 MyISAM 表的 DML 语句(如 INSERT, UPDATE, DELETE)不能放在事务中。