1. 程式人生 > >Sqlserver2000中的事務處理

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幫助檔案>>