- SQL 教程
- SQL - 首页
- SQL - 概述
- SQL - RDBMS 概念
- SQL - 数据库
- SQL - 语法
- SQL - 数据类型
- SQL - 运算符
- SQL - 表达式
- SQL 数据库
- SQL - 创建数据库
- SQL - 删除数据库
- SQL - 选择数据库
- SQL - 重命名数据库
- SQL - 显示数据库
- SQL - 备份数据库
- SQL 表
- SQL - 创建表
- SQL - 显示表
- SQL - 重命名表
- SQL - 截断表
- SQL - 克隆表
- SQL - 临时表
- SQL - 修改表
- SQL - 删除表
- SQL - 删除表
- SQL - 约束
- SQL 查询
- SQL - INSERT 查询
- SQL - SELECT 查询
- SQL - SELECT INTO
- SQL - INSERT INTO SELECT
- SQL - UPDATE 查询
- SQL - DELETE 查询
- SQL - 排序结果
- SQL 视图
- SQL - 创建视图
- SQL - 更新视图
- SQL - 删除视图
- SQL - 重命名视图
- SQL 运算符和子句
- SQL - WHERE 子句
- SQL - TOP 子句
- SQL - DISTINCT 子句
- SQL - ORDER BY 子句
- SQL - GROUP BY 子句
- SQL - HAVING 子句
- SQL - AND & OR
- SQL - BOOLEAN (BIT) 运算符
- SQL - LIKE 运算符
- SQL - IN 运算符
- SQL - ANY, ALL 运算符
- SQL - EXISTS 运算符
- SQL - CASE
- SQL - NOT 运算符
- SQL - 不等于
- SQL - IS NULL
- SQL - IS NOT NULL
- SQL - NOT NULL
- SQL - BETWEEN 运算符
- SQL - UNION 运算符
- SQL - UNION vs UNION ALL
- SQL - INTERSECT 运算符
- SQL - EXCEPT 运算符
- SQL - 别名
- SQL 连接
- SQL - 使用连接
- SQL - 内连接
- SQL - 左连接
- SQL - 右连接
- SQL - 交叉连接
- SQL - 全连接
- SQL - 自连接
- SQL - 删除连接
- SQL - 更新连接
- SQL - 左连接 vs 右连接
- SQL - UNION vs 连接
- SQL 密钥
- SQL - 唯一键
- SQL - 主键
- SQL - 外键
- SQL - 组合键
- SQL - 候选键
- SQL 索引
- SQL - 索引
- SQL - 创建索引
- SQL - 删除索引
- SQL - 显示索引
- SQL - 唯一索引
- SQL - 聚集索引
- SQL - 非聚集索引
- 高级 SQL
- SQL - 通配符
- SQL - 注释
- SQL - 注入
- SQL - 托管
- SQL - MIN & MAX
- SQL - NULL 函数
- SQL - CHECK 约束
- SQL - DEFAULT 约束
- SQL - 存储过程
- SQL - NULL 值
- SQL - 事务
- SQL - 子查询
- SQL - 处理重复项
- SQL - 使用序列
- SQL - 自动递增
- SQL - 日期和时间
- SQL - 游标
- SQL - 通用表表达式
- SQL - GROUP BY vs ORDER BY
- SQL - IN vs EXISTS
- SQL - 数据库调优
- SQL 函数参考
- SQL - 日期函数
- SQL - 字符串函数
- SQL - 聚合函数
- SQL - 数值函数
- SQL - 文本和图像函数
- SQL - 统计函数
- SQL - 逻辑函数
- SQL - 游标函数
- SQL - JSON 函数
- SQL - 转换函数
- SQL - 数据类型函数
- SQL 有用资源
- SQL - 问答
- SQL - 快速指南
- SQL - 有用函数
- SQL - 有用资源
- SQL - 讨论
SQL - 事务
SQL 事务
事务是在数据库上执行的一个工作单元或序列。事务以逻辑顺序完成,无论是用户手动执行,还是由某种数据库程序自动执行。
事务是对数据库进行一个或多个更改的传播。例如,如果您正在创建、更新或删除表中的记录,则您正在对该表执行事务。控制这些事务非常重要,以确保数据完整性并处理数据库错误。
实际上,您会将许多 SQL 查询组合到一个组中,并将它们一起执行作为事务的一部分。
事务的特性
事务具有以下四个标准属性,通常用首字母缩写词 **ACID** 来表示。
**原子性** - 确保工作单元中的所有操作都成功完成。否则,事务在故障点中止,所有先前操作都回滚到其先前状态。
**一致性** - 确保数据库在成功提交的事务后正确更改状态。
**隔离性** - 使事务能够独立于彼此并且对彼此透明地运行。
**持久性** - 确保已提交事务的结果或效果在系统故障的情况下仍然存在。
事务控制命令
事务控制命令仅与 **DML 命令** 一起使用,例如 - INSERT、UPDATE 和 DELETE。在创建或删除表时不能使用它们,因为这些操作会自动提交到数据库。以下命令用于控制事务。
**COMMIT** - 保存更改。
**ROLLBACK** - 回滚更改。
**SAVEPOINT** - 在事务组中创建回滚点。
**SET TRANSACTION** - 为事务命名。
COMMIT 命令
COMMIT 命令是用于保存事务调用的更改的事务命令。它保存自上次 COMMIT 或 ROLLBACK 以来对数据库进行的所有事务。
COMMIT 命令的语法如下所示。
COMMIT;
示例
首先,让我们使用以下查询创建一个名为 CUSTOMERS 的表:
CREATE TABLE CUSTOMERS ( ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL, ADDRESS CHAR (25), SALARY DECIMAL (18, 2), PRIMARY KEY (ID) );
我们将一些记录插入到上面创建的表中:
INSERT INTO CUSTOMERS VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00), (2, 'Khilan', 25, 'Delhi', 1500.00), (3, 'Kaushik', 23, 'Kota', 2000.00), (4, 'Chaitali', 25, 'Mumbai', 6500.00), (5, 'Hardik', 27, 'Bhopal', 8500.00), (6, 'Komal', 22, 'Hyderabad', 4500.00), (7, 'Muffy', 24, 'Indore', 10000.00);
表将如下创建:
ID | 姓名 | 年龄 | 地址 | 薪水 |
---|---|---|---|---|
1 | Ramesh | 32 | Ahmedabad | 2000.00 |
2 | Khilan | 25 | Delhi | 1500.00 |
3 | Kaushik | 23 | Kota | 2000.00 |
4 | Chaitali | 25 | Mumbai | 6500.00 |
5 | Hardik | 27 | Bhopal | 8500.00 |
6 | Komal | 22 | Hyderabad | 4500.00 |
7 | Muffy | 24 | Indore | 10000.00 |
以下查询将删除表中年龄为 25 的记录,然后提交数据库中的更改。
DELETE FROM CUSTOMERS WHERE AGE = 25; COMMIT;
验证
表中的两行将被删除,如果您使用 SELECT 语句验证 CUSTOMERS 表的内容,如下所示:
SELECT * FROM CUSTOMERS;
表将显示如下:
ID | 姓名 | 年龄 | 地址 | 薪水 |
---|---|---|---|---|
1 | Ramesh | 32 | Ahmedabad | 2000.00 |
3 | Kaushik | 23 | Kota | 2000.00 |
5 | Hardik | 27 | Bhopal | 8500.00 |
6 | Komal | 22 | Hyderabad | 4500.00 |
7 | Muffy | 24 | Indore | 10000.00 |
ROLLBACK 命令
ROLLBACK 命令是用于撤消尚未保存到数据库的事务的事务命令。此命令只能撤消自上次 COMMIT 或 ROLLBACK 以来进行的事务。
ROLLBACK 命令的语法如下:
ROLLBACK;
示例
假设 CUSTOMERS 表具有以下记录:
ID | 姓名 | 年龄 | 地址 | 薪水 |
---|---|---|---|---|
1 | Ramesh | 32 | Ahmedabad | 2000.00 |
2 | Khilan | 25 | Delhi | 1500.00 |
3 | Kaushik | 23 | Kota | 2000.00 |
4 | Chaitali | 25 | Mumbai | 6500.00 |
5 | Hardik | 27 | Bhopal | 8500.00 |
6 | Komal | 22 | Hyderabad | 4500.00 |
7 | Muffy | 24 | Indore | 10000.00 |
以下查询将删除表中 AGE 值为 25 的记录,然后回滚数据库中的更改。
DELETE FROM CUSTOMERS WHERE AGE = 25; ROLLBACK;
验证
删除操作不会影响表,SELECT 语句将产生以下结果。
ID | 姓名 | 年龄 | 地址 | 薪水 |
---|---|---|---|---|
1 | Ramesh | 32 | Ahmedabad | 2000.00 |
2 | Khilan | 25 | Delhi | 1500.00 |
3 | Kaushik | 23 | Kota | 2000.00 |
4 | Chaitali | 25 | Mumbai | 6500.00 |
5 | Hardik | 27 | Bhopal | 8500.00 |
6 | Komal | 22 | Hyderabad | 4500.00 |
7 | Muffy | 24 | Indore | 10000.00 |
SAVEPOINT 命令
SAVEPOINT 是事务中的逻辑回滚点。
通常,当您执行 ROLLBACK 命令时,它会撤消直到上次 COMMIT 的更改。但是,如果您创建保存点,您可以将事务部分回滚到这些点。您可以在两次提交之间创建多个保存点。
在事务中创建 SAVEPOINT 的语法如下所示。
SAVEPOINT savepoint_name;
然后,要回滚到创建的 SAVEPOINT,您可以使用以下语法:
ROLLBACK TO savepoint_name;
示例
以下是一个示例,您计划从 CUSTOMERS 表中删除三条不同的记录。您希望在每次删除之前创建一个 SAVEPOINT,以便您可以随时回滚到任何 SAVEPOINT 以将适当的数据返回到其原始状态。
假设 CUSTOMERS 表具有以下记录。
ID | 姓名 | 年龄 | 地址 | 薪水 |
---|---|---|---|---|
1 | Ramesh | 32 | Ahmedabad | 2000.00 |
2 | Khilan | 25 | Delhi | 1500.00 |
3 | Kaushik | 23 | Kota | 2000.00 |
4 | Chaitali | 25 | Mumbai | 6500.00 |
5 | Hardik | 27 | Bhopal | 8500.00 |
6 | Komal | 22 | Hyderabad | 4500.00 |
7 | Muffy | 24 | Indore | 10000.00 |
以下代码块包含一系列操作。
SAVEPOINT SP1; Query OK, 0 rows affected (0.00 sec) DELETE FROM CUSTOMERS WHERE ID=1; Query OK, 1 row affected (0.01 sec) SAVEPOINT SP2; Query OK, 0 rows affected (0.00 sec) DELETE FROM CUSTOMERS WHERE ID=2; Query OK, 0 rows affected (0.00 sec) SAVEPOINT SP3; Query OK, 0 rows affected (0.00 sec) DELETE FROM CUSTOMERS WHERE ID=3; Query OK, 1 row affected (0.01 sec)
现在已经进行了三次删除,假设您改变了主意,并决定回滚到您标识为 SP2 的 SAVEPOINT。因为 SP2 是在第一次删除后创建的,所以最后两次删除被撤消了:
ROLLBACK TO SP2;
验证
如果您显示 CUSTOMERS 表,您可以注意到只有第一次删除发生了,因为您回滚到了 SP2。
ID | 姓名 | 年龄 | 地址 | 薪水 |
---|---|---|---|---|
2 | Khilan | 25 | Delhi | 1500.00 |
3 | Kaushik | 23 | Kota | 2000.00 |
4 | Chaitali | 25 | Mumbai | 6500.00 |
5 | Hardik | 27 | Bhopal | 8500.00 |
6 | Komal | 22 | Hyderabad | 4500.00 |
7 | Muffy | 24 | Indore | 10000.00 |
RELEASE SAVEPOINT 命令
RELEASE SAVEPOINT 命令用于删除现有的 SAVEPOINT。
RELEASE SAVEPOINT 命令的语法如下所示。
RELEASE SAVEPOINT SAVEPOINT_NAME;
释放 SAVEPOINT 后,您将无法再使用 ROLLBACK 命令撤消自上次 SAVEPOINT 以来执行的事务。
SET TRANSACTION 命令
SET TRANSACTION 命令可用于启动数据库事务。此命令用于指定后续事务的特性。例如,您可以指定事务为只读或读写。
语法
SET TRANSACTION 命令的语法如下所示。
SET TRANSACTION [ READ WRITE | READ ONLY ];