Sqlserver2000中的事務處理
2024-07-21 02:06:13
供稿:網友
 
sqlserver2000中的事務處理 一、       定義及其性質:事務:事務是作為單個邏輯工作單元執行的一系列操作。屬性:一個邏輯工作單元必須有四個屬性,稱為 acid(原子性、一致性、隔離性和持久性)屬性,只有這樣才能成為一個事務:1.      原子性:事務必須是原子工作單元;對于其數據修改,要么全都執行,要么全都不執行。2.      一致性:事務在完成時,必須使所有的數據都保持一致狀態。在相關數據庫中,所有規則都必須應用于事務的修改,以保持所有數據的完整性。事務結束時,所有的內部數據結構(如 b 樹索引或雙向鏈表)都必須是正確的。3.      隔離性:由并發事務所作的修改必須與任何其它并發事務所作的修改隔離。事務查看數據時數據所處的狀態,要么是另一并發事務修改它之前的狀態,要么是另一事務修改它之后的狀態,事務不會查看中間狀態的數據。這稱為可串行性,因為它能夠重新裝載起始數據,并且重播一系列事務,以使數據結束時的狀態與原始事務執行的狀態相同。4.      持久性:事務完成之后,它對于系統的影響是永久性的。該修改即使出現系統故障也將一直保持。二、指定和強制事務處理sql 程序員要負責啟動和結束事務,同時強制保持數據的邏輯一致性。程序員必須定義數據修改的順序,使數據相對于其組織的業務規則保持一致。然后,程序員將這些修改語句包括到一個事務中,使 microsoft? sql server? 能夠強制該事務的物理完整性。企業數據庫系統(如 sql server)有責任提供一種機制,保證每個事務物理的完整性。sql server 提供: 鎖定設備,使事務相互隔離。 記錄設備,保證事務的持久性。即使服務器硬件、操作系統或 sql server 自身出現故障,sql server 也可以在重新啟動時使用事務日志,將所有未完成的事務自動地回滾到系統出現故障的位置。事務管理特性,強制保持事務的原子性和一致性。事務啟動之后,就必須成功完成,否則 sql server 將撤消該事務啟動之后對數據所作的所有修改。三、控制事務:
應用程序主要通過指定事務啟動和結束的時間來控制事務。這可以使用 transact-sql 語句或數據庫 api 函數。系統還必須能夠正確處理那些在事務完成之前便終止事務的錯誤。事務是在連接層進行管理。當事務在一個連接上啟動時,在該連接上執行的所有的 transact-sql 語句在該事務結束之前都是該事務的一部分。
1、啟動事務
在 microsoft® sql server™ 中,可以按顯式自動提交或隱性模式啟動事務。
1)      顯式事務:通過發出 begin transaction 語句顯式啟動事務。
2)      自動提交事務:這是 sql server 的默認模式。每個單獨的 transact-sql 語句都在其完成后提交。不必指定任何語句控制事務。
3)      隱性事務:通過 api 函數或 transact-sql set implicit_transactions on 語句,將隱性事務模式設置為打開。下一個語句自動啟動一個新事務。當該事務完成時,再下一個 transact-sql 語句又將啟動一個新事務。
4)      連接模式在連接層進行管理。如果一個連接從一種事務模式改變到另一種,那么它對任何其它連接的事務模式沒有影響。
2、結束事務
可以使用 commit 或 rollback 語句結束事務。
1)      commit:如果事務成功,則提交。commit 語句保證事務的所有修改在數據庫中都永久有效。commit 語句還釋放資源,如事務使用的鎖。
2)      rollback:如果事務中出現錯誤,或者用戶決定取消事務,可回滾該事務。rollback 語句通過將數據返回到它在事務開始時所處的狀態,來恢復在該事務中所作的所有修改。rollback 還會釋放由事務占用的資源。
3、指定事務邊界
可以用 transact-sql 語句或 api 函數和方法確定 sql server 事務啟動和結束的時間。
1)      transact-sql 語句:使用 begin transaction、commit transaction、commit work、rollback transaction、rollback work 和 set implicit_transactions 語句來描述事務。這些語句主要在 db-library 應用程序和 transact-sql 腳本(如使用 osql 命令提示實用工具運行的腳本)中使用。
2)      api 函數和方法:數據庫 api(如 odbc、ole db 和 ado)包含用來描述事務的函數和方法。它們是 sql server 應用程序中用來控制事務的主要機制。
3)      每個事務都必須只由其中的一種方法管理。在同一事務中使用兩種方法可能導致不確定的結果。例如,不應先使用 odbc api 函數啟動一個事務,再使用 transact-sql commit 語句完成該事務。這樣將無法通知 sql server odbc 驅動程序該事務已被提交。在這種情況下,應使用 odbc sqlendtran 函數結束該事務。
4、事務處理過程中的錯誤
1)      如果服務器錯誤使事務無法成功完成,sql server 將自動回滾該事務,并釋放該事務占用的所有資源。如果客戶端與 sql server 的網絡連接中斷了,那么當網絡告知 sql server 該中斷時,將回滾該連接的所有未完成事務。如果客戶端應用程序失敗或客戶計算機崩潰或重啟,也會中斷該連接,而且當網絡告知 sql server 該中斷時,也會回滾所有未完成的連接。如果客戶從該應用程序注銷,所有未完成的事務也會被回滾。
2)      如果批處理中出現運行時語句錯誤(如違反約束),那么 sql server 中默認的行為將是只回滾產生該錯誤的語句。可以使用 set xact_abort 語句改變該行為。在 set xact_abort on 語句執行之后,任何運行時語句錯誤都將導致當前事務自動回滾。編譯錯誤(如語法錯誤)不受 set xact_abort 的影響。
3)     如果出現運行時錯誤或編譯錯誤,那么程序員應該編寫應用程序代碼以便指定正確的操作(commit 或 rollback)。
                                                 參考<<sqlserver2000幫助文件>>