下面的“事務方法”管理在會話處理中的事務,會話由 object 所在處表示:
- BeginTrans 開始一個新的事務。
- CommitTrans 結束當前事務並保存所作的修改。
- RollbackTrans 結束當前事務並將在 rdoEnvironment 對象中的數據庫還原到該當前事務開始時的狀態。
可以對 rdoConnection 對象使用事務方法-但是在這種情況下,事務的範圍只限於在 rdoConnection 下建立的 rdoResultset 和 rdoQuery 對象中。
語法
object.BeginTrans | CommitTrans | RollbackTrans
object 所在處代表一個對象表達式,其值爲“應用於”列表中的一個對象。
說明
當要將在會話中對數據庫所作的一系列改變作爲一個邏輯單元時,可以對 rdoEnvironment 或 rdoConnection 對象使用事務方法。也就是,一個操作集合既以一個集合爲單位完成,也以一個集合爲單位回滾。這樣,如果集合的任何操作失敗,則整個事務也失敗。事務還允許對數據庫作臨時改變- 該改變可用 RollbackTrans 方法取消。
一般,ODBC 驅動程序以下列兩種模式中的一種工作:
- 自動提交模式:當沒有顯式地使用 BeginTrans 方法啓動一個事務,每一個被執行的操作在完成時都立即提交給數據庫。
- 手工提交模式:當顯式地使用 BeginTrans 方法啓動一個事務時,或使用 ODBC SQLSetStmtOption 函數禁止 SQL_AUTO_COMMIT 模式時,或發送一個 SQL 語句啓動一個事務 (BEGIN TRANS) 時,所有操作都是事務中的一部分,並且不作修改地提交給數據庫,直到使用 CommitTrans 方法爲止。如果執行 CommitTrans,或使用 RollbackTrans 方法之前連接失敗,就取消這個操作-回滾。
注意 當使用遠程服務器時,如果該服務器象 Microsoft SQL Server 那樣支持分佈式的事務協調程序 (DTC),就可以初始化和控制跨越多個服務器的事務。也就是,如果在調用一個遠程過程的遠程服務器上調用一個過程,則 DTC 可以保證該操作被包括在初始化的事務中。詳細信息,
一般來說,當必須更新兩個或多個表中的行,並確保在所有的表中所作的改變或者都被完成(提交)、或者一點也不變(回滾)時,使用事務維護數據的完整性。例如,當將錢從一個帳戶轉到另一個帳戶時,需要從一個帳戶上減去一個數並將其加到另一個帳戶上。如果其中有一個修改失敗,帳戶就不會平衡。在修改第一行之前,先使用 BeginTrans 方法,然後,只要再有修改失敗,就可以使用 RollbackTrans 方法撤消所有的修改。在成功地修改了最後一行之後,就使用 CommitTrans 方法。
注意 在一個 rdoEnvironment 對象內,對於該 rdoEnvironment,事務總是全局的,並不只限於一個數據庫,或一個結果集。如果在一個 rdoEnvironment 事務內、在多個數據庫或結果集上完成操作,則 RollbackTrans 方法還原所有的在那些數據庫和結果集上的操作。
一旦使用 CommitTrans,就不能取消在該事務中所作的改變,不過若該事務嵌套在另一個要回滾的事務中除外。除非使用動作查詢直接執行 SQL 事務管理語句,否則事務不能嵌套。如果想模擬覆蓋的、無嵌套的範圍的事務,可以建立另外的 rdoEnvironment 對象包含併發的事務。
注意 可以使用包含事務語句的 SQL 動作查詢。例如,對於 Microsoft SQL Server,可以使用 SQL 語句,如,BEGIN TRANSACTION, COMMIT TRANSACTION 或 ROLLBACK TRANSACTION。這個技術支持 ODBC 驅動程序所不支持的嵌套事務。
如果不保存或者要回滾任何掛起的事務,就關閉 rdoEnvironment 對象,則事務會自動回滾。
如果不先使用 BeginTrans 方法就使用了 CommitTrans 或 RollbackTrans 方法,那麼不會產生錯誤。
有些數據庫不支持事務,在這些情況下,rdoConnection 對象或 rdoResultset 對象的 Transactions 屬性爲 False。爲了保證數據庫能支持事務,在使用 BeginTrans 方法之前,先檢查 rdoConnection 對象的 Transactions 屬性的值。如果對多個數據庫使用 rdoResultset 對象,則先檢查該 rdoResultset 對象的 Transactions 屬性。如果 rdoConnection 或 rdoResultset 不支持事務,則這些方法將被忽略並且不產生錯誤。