DCL中 COMMIT 与 ROLLBACK 的使用

  • Post author:
  • Post category:其他




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 版权协议,转载请附上原文出处链接和本声明。