事務基礎概念 (共通)
ACID 特性:原子性、一致性、隔離性、持久性。修改在內存完成,Commit 持久化,故障時未提交回滾、已提交通過 Redo/Log 重做。
事務類型與啟動方式差異
| 特性 | SQL Server | Oracle |
| 事務模式 | 三種:自動提交(默認)、顯式 (BEGIN TRAN)、隱式 (SET IMPLICIT_TRANSACTIONS ON) | 單一模式:首條 DML 隱式啟動,Commit/Rollback 結束 (類似 SQL Server 隱式模式) |
| 自動提交行為 | 每條語句獨立事務 | 無此模式 |
| 顯式事務示例 | BEGIN TRAN ... COMMIT | 無需 BEGIN,直接寫 DML 序列 |
隔離級別實現機制核心差異
| 隔離級別 | SQL Server (鎖機制) | Oracle (多版本並發控制 MVCC) |
| Read Uncommitted | 支援,讀未提交 (髒讀) | 不支援,根本不允許 |
| Read Committed (默認) | 讀已提交,用共享鎖;寫不阻塞讀,讀阻塞寫 | 讀已提交,**讀不阻塞寫、寫不阻塞讀** (讀取 Undo 中舊版本) |
| Repeatable Read | 支援,事務期間對讀取行加鎖持有至結束 | 不支援 (但可用 Serializable 達到更強保證) |
| Serializable | 表級鎖,完全串行化 | 支援,**讀取事務啟動時刻的快照** (基於 Undo),無鎖等待 |
核心優勢:Oracle **讀寫互不阻塞**,高並發下吞吐量遠超 SQL Server 鎖模式。
DDL 語句對事務的影響
| 場景 | Oracle | SQL Server |
| DDL 前後隱式操作 | COMMIT; DDL; IF ERROR ROLLBACK ELSE COMMIT | 無隱式 Commit,同普通 DML |
| 測試用例 | INSERT 'Before';
CREATE TABLE T(...);
INSERT 'After';
ROLLBACK; 結果:'Before' 已提交保留,表 T 存在,'After' 回滾 | 同樣用例:ROLLBACK 後 'Before'/'After' 均回滾,表 T 不存在 |
客戶端工具斷開連接行為差異
- SQL*Plus (Oracle):退出前**自動 COMMIT**
- osql / SSMS (SQL Server):退出時**自動 ROLLBACK** (隱式事務模式下影響顯著)
總結建議
- 移植應用時**必須重寫事務邏輯**,不能假設行為一致
- Oracle 推薦默認 Read Committed (語句級),長一致性查詢用 Serializable
- DDL 操作在 Oracle 中謹慎放在事務中間,會強制分裂事務
- 連接池配置需注意:Oracle 連接歸還前若有未提交工作,視業務決定 Commit/Rollback