簡介
在 SQL Server 的早期版本中,資料庫應用程式無法在單個連線上保持多個活動語句。使用 SQL Server 默認結果集時,應用程式必須先處理或取消自某一批處理生成的所有結果集,然後才能執行該連線上的其他任何批處理。SQL Server 2005 引入了新連線屬性,支持應用程式在每個連線上擁有多個待定請求,特別是支持每個連線具有多個活動的默認結果集。
功能
MARS 通過以下新功能簡化了應用程式設計:
應用程式可以同時打開多個默認結果集,並且交錯讀取它們。
應用程式可以在默認結果集打開的同時執行其他語句(例如 INSERT、UPDATE、DELETE 和存儲過程調用)。
下列指南對使用 MARS 的應用程式很有幫助:
默認結果集應該用於使用單個 SQL 語句(SELECT、帶 OUTPUT 的 DML、RECEIVE、READ TEXT 等)生成的短期或較小結果集。
伺服器游標應該用於使用單個 SQL 語句生成的長期或較大結果集。
對於過程請求(不論它們是否返回結果)以及返回多個結果的批處理,應始終讀取到它們的結果的末尾。
儘可能使用 API 調用(而不是 Transact-SQL 語句)更改連線屬性和管理事務。
在 MARS 中,有多個批處理並發運行時禁止會話範圍內的模擬。
注意: |
默認情況下,不啟用 MARS 功能。若要在使用 SQL Server Native Client 連線 SQL Server 時使用 MARS,必須在連線字元串內專門啟用 MARS。有關詳細信息,請參閱本主題下文中的 SQL Server Native Client OLE DB 訪問接口和 SQL Server Native Client ODBC 驅動程式等章節。 |
SQL Server Native Client 不限制某個連線上的活動語句的數量。
不需要同時執行多個多語句批處理或存儲過程的典型應用程式將受益於 MARS,且無需了解如何實現 MARS。不過,具有較複雜要求的應用程式確實需要考慮到這一點。
MARS 支持在單一連線中交錯執行多個請求。即:它允許運行批處理,並且在執行過程中還允許執行其他請求。不過請注意,MARS 是從交錯執行而不是從並行執行的角度定義的。
MARS 基礎結構允許以交錯方式執行多個批處理,儘管只能在定義完善的時間點切換執行。此外,多數語句必須在同一批處理內以原子方式運行。向客戶端返回行的語句(有時稱為 “收穫點”)在完成前可以交錯執行,同時向客戶端傳送行,例如:
SELECT
FETCH
RECEIVE
作為存儲過程或批處理的一部分執行的任何其他語句必須運行完畢,之後才能切換到執行其他 MARS 請求。
多個批處理交錯執行的確切方式受若干因素影響,很難預測包含收穫點的多個批處理中的命令的確切執行順序。注意避免交錯執行此類複雜批處理所產生的意外負面影響。
要避免這些問題,可使用 API 調用而不是 Transact-SQL 語句來管理連線狀態(SET、USE)和事務(BEGIN TRAN、COMMIT、ROLLBACK),方法是不在同樣包含收穫點的多語句批處理中包括這些語句,以及通過使用或取消所有結果來順序執行此類批處理。
注意: |
啟用 MARS 時,啟動手動或隱式事務的批處理或存儲過程必須完成該事務,之後批處理才能退出。如果不是這樣,SQL Server 將在批處理完成時回滾該事務所做的所有更改。這種事務由 SQL Server 作為批範圍的事務管理。這是 SQL Server 2005 新引入的事務類型,用於在啟用 MARS 時支持使用功能良好的現有存儲過程。有關批範圍的事務的詳細信息,請參閱事務 (Transact-SQL)和控制事務(資料庫引擎)。 |