| 特性 | SQL Server | Oracle |
| 交易類型 | 自動提交(預設)、顯式交易、隱式交易 | 無此分類 |
| 自動提交 | 每條 SQL 獨立交易 | 不支援 |
| 顯式交易 | BEGIN TRAN ... COMMIT/ROLLBACK | 隱含於 DML 開始 |
| 隱式交易 | SET IMPLICIT_TRANSACTIONS ON 後 DML 自動開啟 | 預設行為:DML 開啟,COMMIT/ROLLBACK 結束 |
二、隔離級別實作機制大不同
SQL-92 定義四級:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE。設定語法相同:SET TRANSACTION ISOLATION LEVEL READ COMMITTED。
SQL Server:鎖基礎實作
READ UNCOMMITTED:髒讀,生產環境極少用
READ COMMITTED (預設):只讀已提交,讀取等待寫鎖釋放;不可重複讀
REPEATABLE READ:整個交易對讀取記錄加鎖,防止修改,但不阻擋新增 (Phantom Read)
SERIALIZABLE:整個交易對整張表加鎖,完全序列化,效能最差
Oracle:多版本並發控制 (MVCC) + Undo Segment
- 無 READ UNCOMMITTED、無 REPEATABLE READ:根本不允許髒讀
READ COMMITTED (預設,語句級):查詢讀取 Undo Segment 中的提交前版本,**讀不阻寫、寫不阻讀**
SERIALIZABLE (交易級):只看交易開始前已提交資料;若 Undo 版本過舊報 ORA-01555;同樣讀寫不互相阻塞
核心優勢:Oracle 透過 Undo Segment 實現非阻塞讀取,高並發下效能遠優於 SQL Server 鎖機制。
三、DDL 對交易的影響
Oracle:DDL 隱含雙重 COMMIT
COMMIT; -- 執行 DDL 前自動提交
DDL_STATEMENT; -- 執行 DDL
IF ERROR THEN ROLLBACK; ELSE COMMIT; END IF; -- 執行後再次提交或回滾
範例:
INSERT INTO t VALUES ('Before');
CREATE TABLE x (id INT); -- 隱含 COMMIT
INSERT INTO t VALUES ('After');
ROLLBACK;
結果:Before 已提交不回滾,CREATE TABLE 生效,After 回滾。
SQL Server:DDL 參與當前交易
同樣範例,ROLLBACK 會回滾 Before、After 及 CREATE TABLE;COMMIT 則全數提交。
四、用戶中斷連線行為差異