| 類別 | 全稱 | 指令 | 核心功能 |
|---|---|---|---|
| DDL | Data Definition Language | CREATE, ALTER, DROP, TRUNCATE, RENAME | 定義/管理資料庫物件結構 |
| DML | Data Manipulation Language | SELECT, INSERT, UPDATE, DELETE, MERGE | 操作資料內容 |
| DCL | Data Control Language | GRANT, REVOKE, COMMIT, ROLLBACK, SAVEPOINT | 權限控制、交易管理 |
COMMIT:確認變更,釋放鎖,回滾段標記可覆寫。ROLLBACK:撤銷變更,利用回滾段還原資料,釋放鎖。SELECT 不產生回滾段記錄(唯讀),結果集來自共用緩衝區/資料頁。| 模式 | 觸發方式 | 範例 | 適用場景 |
|---|---|---|---|
| 顯式提交 | 執行 COMMIT 指令 | BEGIN TRAN; UPDATE...; COMMIT; | 業務邏輯明確控制交易邊界(推薦) |
| 隱式提交 | 執行 DDL/DCL 特定指令自動提交 | CREATE TABLE...; -- 當前交易自動提交 | 結構變更、權限變更、連線管理指令 |
| 自動提交 | SET AUTOCOMMIT ON(預設 ON) | 每條 DML 立即提交 | 互動式查詢、簡單腳本;生產批次作業請關閉 |
ALTER, AUDIT, COMMENT, CONNECT, CREATE, DISCONNECT, DROP,
EXIT, GRANT, NOAUDIT, QUIT, REVOKE, RENAME, TRUNCATE
關鍵含義:若在交易區塊中執行上述指令,**當前交易會被隱式提交**,後續 ROLLBACK 無法撤銷交易開始至該指令前的 DML 操作。
BEGIN TRAN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
CREATE TABLE tmp_log (...); -- 隱式提交!前面 UPDATE 已提交,無法回滾
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
ROLLBACK; -- 僅回滾第二個 UPDATE,第一個已提交
對策:交易區塊嚴禁混入 DDL/DCL 隱性提交指令。結構變更放在交易外,或使用只支援交易 DDL 的資料庫(PostgreSQL、SQL Server 部分 DDL 支援交易回滾)。
-- AUTOCOMMIT ON 時
UPDATE accounts SET balance = balance - 100 WHERE id = 1; -- 已提交
UPDATE accounts SET balance = balance + 100 WHERE id = 2; -- 失敗(如鎖等待超時)
-- 結果:扣款成功、存款失敗,資料不一致
對策:批次業務務必 SET AUTOCOMMIT OFF / BEGIN TRAN 明確控制。
SELECT 結果來自共用緩衝區(Buffer Pool),非回滾段。未提交的變更對其他連線**不可見**(隔離級別 READ COMMITTED),但同連線後續 SELECT 可見(隔離級別允許髒讀時)。
-- 存檔點:大交易中建立部分回滾點
SAVEPOINT sp1;
UPDATE ...;
SAVEPOINT sp2;
DELETE ...;
ROLLBACK TO sp1; -- 僅回滾至 sp1,sp1 後操作保留
RELEASE SAVEPOINT sp1; -- 釋放存檔點
-- 交易隔離級別
SET TRANSACTION ISOLATION LEVEL READ COMMITTED | REPEATABLE READ | SERIALIZABLE | SNAPSHOT;
| 特性 | Oracle | SQL Server | PostgreSQL | MySQL (InnoDB) |
|---|---|---|---|---|
| DDL 交易支援 | 不支援(隱式提交) | 部分支援(CREATE/DROP/ALTER 可回滾) | 完整支援 | 不支援(隱式提交) |
| AUTOCOMMIT 預設 | OFF | OFF (隱式交易模式) | OFF | ON |
| SAVEPOINT | 支援 | 支援 | 支援 | 支援 |
從 SQL 語言分類理解 COMMIT/ROLLBACK,能避開隱性提交陷阱,建立健壯的交易控制習慣。