程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL Server 2005 中的 Multiple Active Result Set (MARS)

SQL Server 2005 中的 Multiple Active Result Set (MARS)

編輯:關於SqlServer
Result Set (MARS)(1)。

簡介

所有 SQL Server 數據訪問應用程序編程接口 (API) 都提供了一個抽象來表示會話和會話中的請求。SQL Server 2000 以及更早的版本限制編程模型,它要求任何時候一個給定的會話中最多只能有一個待定的請求。有幾個替代辦法被用來解決這種限制,在這些替代辦法中,最常見的可能就是服務器端光標。SQL Server 2005 實現了 Multiple Active Result Set (MARS),它解除了這個約束。本文介紹了 MARS 的設計、結構和語義變更,以及為了從這些改進中得到最大收益,應用程序應當注意什麼。

SQL Server 2000 Data Access Recap

目前支持用於構建 SQL Server 應用程序的主要數據訪問 API 是 ODBC、OLE-DB、ADO 和 SqlClIEnt .Net Provider。1它們全部都提供一個抽象來表示一個指向服務器的已建立連接,同時提供另外一個抽象來表示在這個連接之下執行的請求。例如,SqlClIEnt 使用 SqlConnection 和 SqlCommand 對象,而 ODBC 則使用 SQL_HANDLE_DBC 類型和 SQL_HANDLE_STMT 類型的句柄。

所有發送給 SQL Server 的執行請求都是幾乎以下兩種形式之一:1) 一組 T-SQL 語句,通常也稱為批處理,或者 2) 存儲過程或函數的名稱,加上參數值(如果合適)。請注意,提交一個 SELECT 或 DML 語句給服務器是一個單語句批處理,這是第一類請求的特例。

在任何一種情況下,SQL Server 都會重申批處理或存儲過程中包含的語句,然後執行這些語句。語句可能會生成結果,也可能不生成結果,並且語句可能會向調用者返回附加信息,也可能不返回。

結果主要是由 SELECT 和 FETCH 生成的。SQL Server 通過將結果返回給調用者來執行 SELECT 語句。這意味著,在查詢執行引擎產生行的同時,這些行會被寫入網絡。更確切地說,所產生的這些行會被復制到預先保留的網絡緩沖區中,然後緩沖區會被返回給調用者。網絡寫入操作會成功,並在客戶端驅動程序從網絡中讀取時釋放已用過的緩沖區。如果客戶端沒有消耗結果,在相同點上的網絡寫入操作將會被阻止,服務器中的網絡緩沖區將會被填滿,執行就會被掛起,等待狀態和執行線程,直到客戶端驅動程序捕獲讀取。這種產生結果和檢索結果的模式通常被稱為“默認結果集”,更正式的名稱則是“流水游標”。

附加信息也可能以其他方式(可能沒有結果返回方式那麼明顯)被返回給調用者。這種情況包括錯誤、警告和信息性消息。它們或者通過 PRINT 和 RAISERROR 語句顯式返回,或者通過語句執行期間產生的警告和錯誤隱式返回。同樣地,當 NOCOUNT 設置選項被設置為 OFF 時,SQL Server 會對每個已執行的語句發送一個“done row count”標記。這種附加信息也可能導致網絡寫入緩沖區被填滿和執行被掛起。

這種背景使我們可以理解 SQL Server 2000 以及更早版本在支持每連接多個待定請求時的一些編程模型限制。

“連接繁忙”

對於本文中的示例,我們將假定以下這樣一個簡單的情境:一個松散連接的清單處理系統使用“Operations”表作為隊列來接收來自其他組件的請求:

OperaTIONS

已處理

Operation_id

int

主鍵

Operation_code

char(1)

'D' – decrease inventory

'I' – increase inventory

'R' – reserve inventory

product_id

uniqueidentifIEr

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved