---
# System prepended metadata

title: MySQL COMMIT / ROLLBACK / TRUNCATE / DELETE
tags: [MySQL]

---

# MySQL COMMIT / ROLLBACK / TRUNCATE / DELETE

**COMMIT**: 提交數據。一但執行 COMMIT，則數據就被永久的保留在數據庫中，意味著數據不可以回滾。
* 範例
```sql=
START TRANSACTION;
DELETE FROM orderitems WHERE order_num = 20010;
DELETE FROM orders WHERE order_num = 20010;
COMMIT;
```
在这个例子中，从系统中完全删除订单20010。因为涉及更新两个数据库表orders和orderItems，所以使用事务处理块来保证订单不被部分删除。最后的COMMIT语句仅在不出错时写出更改。如果第一条DELETE起作用，但第二条失败，则DELETE不会提交（实际上，它是被自动撤销的）。

**ROLLBACK**: 回滾數據。一但執行 ROLLBACK，則可以實現數據庫的回滾，回滾到最近的一次 COMMIT 之後。

### 使用保留點
`SAVEPOINT` `ROLLBACK TO`

### 對比 TRUNCATE TABLE 和 DELETE FROM
相同點：都可以實現對表中所有數據的刪除，同時保留表結構。

不同點：
1. TRUNCATE TABLE：一旦執行此操作，表數據全部清除。同時，數據是不可以回滾的。
2. DELETE FROM：一旦執行此操作，表數據可以全部清除（不帶WHERE）。同時，數據是可以實現回滾的。

### DDL 和 DML 的說明
1. DDL（CREATE 、 DROP 、 ALTER、TRUNCATE 等）的操作一旦執行，就不可回滾。指令SET autocommit = FALSE對DDL操作失效。(因為在執行完DDL操作之後，一定會執行一次COMMIT。而此COMMIT操作不受 SETautocommit = FALSE影響。)
2. DML（INSERT 、 DELETE 、 UPDATE 、 SELECT等）的操作默認情況，一旦執行，也是不可回滾的。但是，如果在執行DML之前，執行 SET autocommit = FALSE，則執行的DML操作就可以實現回滾。

###### tags: `MySQL`