事務()
事務是SQL提供的一種機制用於強制實施數據庫的完整性並保持數據的統一性事務提供了這樣一種機制可以確保將多個步驟的操作作為單個執行單元如果事務中涉及的任何一個步驟失敗那麼整個事務都將回滾如果所有的步驟都已經成功完成那麼既可以提交事務(即將所有的修改保存回數據庫)也可以回滾事務(即取消所有修改)
盡管保留了SQL標准的靈魂但各個RDBMS廠商在對事務的實現上存在著一定的差異桌面型數據庫在嵌入數據庫的代碼中處理事務(對於Microsoft Access來說是VBA)其他RDBMSOracleIBM DBMicrosoft SQL Server 和PostgreSQL都具有健壯的事務支持MySQL實現了一個獨一無二的特性即為表指定存儲引擎的功能MySQL的兩種存儲引擎InnoDB和IBMDBI都提供了對事務的原生支持
什麼是事務
事務在更小的粒度上補充了會話的概念它將發生在會話期間的每一個操作劃分為邏輯的工作單元通過這樣的辦法數據庫操作那些涉及數據修改的操作將按照步驟一步一步地執行並且可以在任何時刻回滾操作或者在每一個步驟都成功執行的情況下提交這些操作
涉及創建和銷毀數據庫對象的數據定義語言(DDL)結構的修改並不是事務性的可能無法回滾這取決於RDBMS以及一些附加的參數設置(例如隔離級別這將在本章後面進行討論)
SQL標准一開始就定義了事務並在後續的標准中增強了這一概念根據SQL標准事務是由RDBMS啟動的並一直持續到發出一條COMMIT或ROLLBACK語句細節則由RDBMS自己實現表列出了SQL標准定義的事務管理語句
表 SQL標准定義的事務管理語句
一個工作單元必須滿足ACID的條件才能稱之為一個事務ACID這個首字母縮略詞代表了如下含義
原子性所有修改要麼全部接受要麼全部取消如果批中的任何一個語句失敗則所有修改必須被復原
一致性在事務完成或回滾時操作中涉及的所有數據必須保持一致性狀態不能破壞數據庫的完整性
隔離性除非將事務提交給數據庫否則一個事務不應該知道任何其他事務對數據所做的修改可以設置不同的隔離級別來改變這一默認行為
持久性對於已經成功提交到數據庫的事務其結果將保存在數據庫中
關於事務一個真實生活的例子就是ATM(銀行的自動取款機)的取款操作假設你需要取一筆錢並決定從最近的取款機取錢你只需要將你的銀行卡(用戶ID)插入取款機並輸入你的個人識別碼(PIN)就可以開始一個會話過程一旦銀行確認了你的身份就允許你繼續操作你可以要求提取指定數量的現金這時就會開始一個事務它涉及幾個操作取款機必須檢查你的賬戶驗證你是否具有足夠的錢來完成該事務並從你的賬戶總額中減去取款金額然後再向你公布賬單如果其中任何一個步驟(以及其他一些步驟這取決於指定銀行定義的策略)失敗則必須取消該事務所有數據都必須恢復到事務開始之前的狀態這意味著除非RDBMS已經從你的賬戶余額中減去了取款額否則你無法取到現金除非你的賬戶上有足夠的余額來完成該事務否則銀行將無法從你的賬戶余額中減去取款額在所有這些操作都成功之後你才能取到現金無論什麼原因(例如你取消了操作或者銀行取款機發生故障)如果其中任何一個步驟失敗則所有的改變都必須回滾到事務之前的狀態
在ANSI/ISO的SQL標准中定義了事務的模型它規定事務以隱式方式開始在成功執行了該事務的所有邏輯單元之後使用一個顯式的COMMIT或者當需要回滾未提交的變更時使用一個顯式的ROLLBACK(例如當程序異常終止時)絕大多數RDBMS都遵循這一事務模型
顯式事務和隱式事務
在SQL標准中將隱式事務作為默認的事務行為這種方式過於小心謹慎了無論何時如果在會話期間執行了某些DDL和DML語句RDBMS就會啟動(或繼續)一個事務通過發出一條COMMIT語句或者一條ROLLBACK語句就可以終止事務
顯式事務是由客戶端使用BEGIN TRANSACTION語句來啟動的並采用與隱式事務類似的辦法手動發出命令來終止事務可以為顯式事務定義一個名稱但這是可選的為事務定義名稱有助於更好地維護代碼
例如Microsoft SQL Server 提供了SETIMPLICIT_TRANSACTIONS{ON|OFF}語句用於配置事務的默認行為如果該選項為ON當聲明了下列語句之一時SQL Server將自動啟動一個事務ALTER TABLECREATEDELETEDROPFETCHGRANTINSERTOPENREVOKESELECTTRUNCATETABLE和UPDATE事務必須顯式地提交或者顯式地回滾一旦執行了前面所列的任何一個語句就會啟動一個新事務將IMPLICIT_TRANSACTIONS選項調整為OFF將返回到事務默認的自動提交事務模式
盡管並非SQL標准的要求但在絕大多數RDBMS中在任何DDL語句之前和之後都會隱式地發出一個COMMIT命令
返回目錄SQL實戰新手入門
編輯推薦
Oracle索引技術
高性能MySQL
數據倉庫與數據挖掘培訓視頻教程
From:http://tw.wingwit.com/Article/program/SQL/201311/16450.html