第十五章

使用Transactions維護數據庫的一致性

•Transaction 是一系列一個或多個資料陳述可以開始或結束

•Transaction是一個邏輯工作單元

–定義business rules

–通常包括最少一個數據修改

–Transforms數據庫從一個一致狀態

•Transaction有兩種可能的結果

–Committed

•全部修改都順利完成

–Rolled back

•任何和所有的修改被取消

•規則

•保護資料當軟、體軟或電源固障時

•允許數據隔離,以便多個用戶可以訪問資料而不互相干擾

Transaction結構

•begin tran

•begin { tran | transaction } [ transaction_name ]

•開始Transaction

•commit tran

•commit [ tran | transaction | work ] [ transaction_name ]

•結束Transaction

•提交所有修改

•修改就不會被撤銷

•rollback tran

•rollback [ tran [ transaction_name | savepoint_name ] | transaction [ transaction | savepoint_name ] | work [ transaction | savepoint_name ] ]

•rollback tran同時結束Transaction

•它復原在Transaction中所做的任何修改

•返回繼續執行陳述

•save tran

•save { transaction | tran } sevepoint_name

•save tran創建一個命名的儲存點

•一個命名的儲存點允許部分rollback

•巢狀Transactions

•當你嵌套Transaction

•最外層的begin和commit真正開始和結束的Transaction

•內層begin和commit語句只保留巢狀層級的軌跡

•巢狀Rollback

•當非巢狀儲存點rollback執行

•rollback返回正在進行中的所有Transaction,不論rollback巢狀層級

•Transaction結束

•繼續執行roolback之後的陳述

•@@trancount

•@@trancount是一個全域變數,保持軌跡巢狀層級

•begin tran 會讓 @@trancount 加一

•commit tran 會讓 @@trancount 減一

•rollback tran 會讓 @@trancount 為 0

•save tran 和 rollback savepoint_name 不會改變 @@trancount 的值

•Transaction Log

•Transaction Log記錄每次insert、update和delete

•該系統採用的Transaction Log復原已返回的資料修改

•Transaction Log記錄的Transaction begins,commit和rollback

–如果服務器在Transaction過程中發生故障,並無rollback或commit的記錄

–恢復過程中,被取消交易中沒有記錄過程rollback或commit過程的修改

•Transaction Mode

•Transaction模式指定伺服器應該如何定義Transaction

–Unchained

•在Unchained Mode需要一個明確的begin tran陳述

•還需要一個明確的commit tran或rollback tran

•這種模式是Adaptive Server預設的

–這是不符合ANSI

–Chained

•Chain Mode中,服務器之前執行以下隱含的begin tran

–DML架構:insert、update、delete、select

–Cursor架構:open、fetch

•需要一個明確的commit work或者rollback work

•這種模式是符合ANSI

•查詢

select @@tranchained

•儲存

set chained { on | off }

•Transaction Errors

•兩種類型的錯誤檢查

–資料修改陳述式失敗

–不修改數據的資料修改陳述式

•Transaction錯誤管理兩個全域變數

–@@error

•當一個數據修改發生錯誤

•Transaction應該返回

•執行應該退出批次,Transaction,或存儲過程

•建議的做法

•每一個修改語句後,檢查@@error的值

•如果它是非零值

•執行rollback

•然後執行return

–@@rowcount

•當某個數據修改陳述式修改一個或多個行,但不會

•Transaction應該返回

•執行應該退出批次,Transaction,或存儲過程

•建議的做法

•每一個修改語句後,檢查@@rowcount的值

•如果它是非零值

•執行rollback

•然後執行return

•Transaction的錯誤建議

•選擇一個合適的Transaction模式

•程式碼每個批處理Transaction

•監控@ @error和@ @ rowcount來檢測錯誤

•如果發生錯誤

–用戶raiserror返回一條消息,給使用者詳細說明原因

–返回Transaction和使用return,可退出批次,Transaction,或存儲過程