DCL中 COMMIT 与 ROLLBACK
COMMIT:提交数据
-
提交事务,一旦执行
COMMIT
,则数据就被永久的保存在了数据库中,意味着数据不可以回滚。
ROLLBACK:回滚数据
-
一旦执行
ROLLBACK
,则可以实现数据的回滚。回滚到
最近的一次
COMMIT
之后。
DDL 和 DML 的说明
-
DDL的操作一旦执行,就不可回滚。指令
SET autocommit = FALSE
对DDL操作失效。(因为在执行完DDL操作之后,一定会执行一次COMMIT。而此COMMIT操作不受
SET autocommit = FALSE
影响的。) -
DML的操作默认情况,一旦执行,也是不可回滚的。但是,如果在执行DML之前,执行了
SET autocommit = FALSE
,则执行的DML操作就可以实现回滚。
- DDL一定是自动提交即自动保存
- DML默认自动提交,但我们可以通过设置
SET autocommit = FALSE
来让DML操作不自动提交即可实现回滚
SQL中事务的操作
# 开启事务
START TRANSACTION;
或者
BEGIN;
# 提交事务
COMMIT;
# 查看事务默认提交方式 1 -> 自动提交; 0 -> 手动提交
SELECT @@autocommit;
# 设置提交方式为自动提交
SET autocommit = 1;
或者
SET autocommit = TRUE;
# 设置提交方式为手动提交(要实现上述所谈回滚,必须更改为手动提交)
SET autocommit = 0;
或者
SET autocommit = FALSE;
# 回滚事务
ROLLBACK;
对比 TRUNCATE TABLE 和 DELETE FROM
-
相同点:
- 都可以实现对表中所有数据的删除,同时保留表结构。
-
不同点:
- TRUNCATE TABLE:一旦执行此操作,表数据全部清除。同时,数据是不可以回滚的。
- DELETE FROM:一旦执行此操作,表数据可以全部清除(不带WHERE)。同时,数据是可以实现回滚的。
举例
演示 DELETE FROM
mysql> # 演示:DELETE FROM
mysql> #1) 查询初始状态
mysql> SELECT *
-> FROM myemp3;
+--------+-----------+-----------------+
| emp_id | lname | department_name |
+--------+-----------+-----------------+
| 200 | Whalen | Administration |
| 201 | Hartstein | Marketing |
| 202 | Fay | Marketing |
+--------+-----------+-----------------+
3 rows in set (0.00 sec)
mysql> #2) 设置不自动提交
mysql> SET autocommit = FALSE;
Query OK, 0 rows affected (0.00 sec)
mysql> #3) 删除表中数据
mysql> DELETE FROM myemp3;
Query OK, 3 rows affected (0.00 sec)
mysql> #4) 再次查询数据,现在应该为空
mysql> SELECT *
-> FROM myemp3;
Empty set (0.00 sec)
mysql> #5) 回滚事务,即撤销刚才的删除操作
mysql> ROLLBACK;
Query OK, 0 rows affected (0.19 sec)
mysql> #6) 再次查询数据,与初始状态相同
mysql> SELECT *
-> FROM myemp3;
+--------+-----------+-----------------+
| emp_id | lname | department_name |
+--------+-----------+-----------------+
| 200 | Whalen | Administration |
| 201 | Hartstein | Marketing |
| 202 | Fay | Marketing |
+--------+-----------+-----------------+
3 rows in set (0.00 sec)
演示 TRUNCATE TABLE
mysql> # 演示:TRUNCATE TABLE
mysql> #1) 查询初始状态
mysql> SELECT *
-> FROM myemp3;
+--------+-----------+-----------------+
| emp_id | lname | department_name |
+--------+-----------+-----------------+
| 200 | Whalen | Administration |
| 201 | Hartstein | Marketing |
| 202 | Fay | Marketing |
+--------+-----------+-----------------+
3 rows in set (0.00 sec)
mysql> #2) 设置不自动提交
mysql> SET autocommit = FALSE;
Query OK, 0 rows affected (0.00 sec)
mysql> #3) 删除表中数据
mysql> TRUNCATE TABLE myemp3;
Query OK, 0 rows affected (0.26 sec)
mysql> #4) 再次查询数据,现在应该为空
mysql> SELECT *
-> FROM myemp3;
Empty set (0.00 sec)
mysql> #5) 回滚事务,无效
mysql> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)
mysql> #6) 再次查询数据,仍然为空
mysql> SELECT *
-> FROM myemp3;
Empty set (0.00 sec)
版权声明:本文为qq_51938362原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。