SQL Server綁定連接
SQL Server綁定連接是為了解決因為鎖導致數據庫性能下降的問題,SQL Server數據庫服務器提出了一個叫做“SQL Server綁定連接”的解決方案來處理該問題。
SQL Server綁定連接允許兩個或者多個連接共享同一個事務或者鎖定。也就是說,采用了綁定連接之后, 多個用戶可以同時對同一個數據進行操作,而不會有鎖定沖突事件的發生。SQL Server綁定連接可以從同一個應用程序的多個連接中創建;也可以從使用不同連接的多個應用程 序中創建。總之,綁定連接使得協調多個連接上的操作更加容易,可以有效的避免因為鎖沖突而導致的負面作用。
一、應用場景分析。
現在擁有銀行卡的人越來越多。很多人在商場中購物,不會采用現金結算,而喜歡刷卡,成為都市的刷卡一族。現在假設有個客戶在利用銀行卡買東西。 則在一個超市的購物管理系統中,會增加一條購貨記錄,其中包括用戶購貨的內容以及銀行卡號。但是,為了完成這條記錄,通常情況下需要兩個連接。一是需要觸 發一個事務,把產品銷售行添加到銷售表中;二是需要觸發另一個事務,其作用是通過電話線撥出到銀行并使用銀行授權碼來更新銷售事務行,表示銀行扣款成功。 由于必須這兩個事務同時完成才表示購買成功,所以在同一個時刻,兩個連接需要同時更新表中的相同記錄。此時,就會造成鎖沖突。
在實際工作中,有些沒有使用綁定連接的超市,就會在打印出來的回單上手工填上銷售序號。然后財務人員在后續的處理過程中,在手工的添加到報表 中。無疑,這增加了額外的工作量,而且也容易出現錯誤。其實,這完全可以通過綁定連接了解決。
當用戶訪問購物管理系統時,在銷售事務表中會增加一行,其中包含有銀行卡的授權號碼。此時,購物管理系統會對同一服務器創建連個連接,我們假設 為A與B。A連接開始一個事務,將產品銷售記錄添加到銷售表中。在銀行卡授權過程中,服務器將采用擴展存儲過程創建另一個連接B,通過專用線路連接到銀行 并從銀行獲得一個銀行卡授權號碼,把這個號碼添加到新的銷售事務行中。在SQL Server數據庫中,只有通過綁定連接,在能夠實現兩個連接訪問同一行而不出現鎖沖突。這就是綁定連接的最典型的應用之一。
二、綁定連接的實現原理。
綁定連接實現的核心,就在于一塊小小的綁定令牌中。SQL SERVER數據庫連接若要加入到綁定連接中,則必須調用開放數據服務,以獲得一個綁定令牌。綁定令牌其實是一個字符串,它***的標識每一個綁定事務。在 必要的時候,綁定令牌會把自己發送給其他加入到綁定連接中的其他連接。在綁定連接中的其他連接,則會調用SP_BINDSESSION服務,并使用從*** 個連接中接收到的綁定令牌綁定到事務上。從而在同屬于一個綁定連接中的全部連接,就可以共享同一個事務或者鎖定。換句話說,只要綁定令牌相同的連接,就可 以共享同一個事物與鎖。
應用程序在使用綁定連接時,必須注意,一定要從創建***個連接的應用程序代碼將綁定令牌傳送到創建隨后每個綁定連接的應用程序代碼中。也就是 說,***個創建連接的應用程序代碼,不僅要負責綁定令牌的建立,而且同時要負責這個綁定令牌的傳送工作。從另一個角度考慮,也就是指后續的應用程序,不能 夠主動利用相關的語句去獲取另一個進程啟動的事務綁定令牌。只能夠別人自動給你,而不能夠去討要。這是在應用程序開發過程中,必須要注意的一個內容。
可見,應用程序如何有效的傳遞綁定令牌,是綁定連接實現的一個難點。在SQL Server數據庫中,主要提供了三種綁定令牌的傳送方法。
一是如果所有連接都是從同一個應用程序進程創建而來,那么綁定令牌可以存儲在全局內存中,也可以作為參數傳遞到函數中去。二是如果連接是從不同 的應用程序創建而來,那么綁定令牌則需要使用進程間通訊技術,如遠程過程調用或者動態數據交換來傳遞綁定令牌。其實現的復雜性就比***種情況要高的多。三 是在SQL SERVER數據庫服務器中,也可以將綁定令牌保存在某個表中。這個表應該能夠被咬綁定到***個連接的進程所讀取。
不過綁定連接其也不能夠完全消除鎖沖突所帶來的負面影響。因為在一組綁定連接中,任意時刻只能夠有一個連接是活動的。如果一個連接正在服務器上 執行一個語句,或者包含由服務器掛起的結果,那么共享同一事務空間的其他連接都不能夠訪問該服務器。直到當前的連接完成處理或者終止當前的語句為止。可 見,綁定連接其也不能夠全部消除鎖沖突,而能夠降低其對數據庫訪問性能帶來的不利影響。
三、綁定連接的應用場景。
在文章一開頭,筆者就列舉了綁定連接在現實中的應用。其實,綁定連接在數據庫設計與應用軟件開發中,還是具有很大的應用前景的。
如果在開發應用程序或者數據庫的時候,要用到SQL語句的擴展存儲過程,則綁定連接將非常的有用。這些擴展存儲過程語句將代表調用這些綁定連接 的進程。讓調用進程在綁定令牌中作為擴展存儲過程的一個參數進行傳遞,可使得該過程加入到調用進程的事務空間中去,從而將擴展存儲過程與該調用進程結合在 一起。
另外綁定連接在實際工作中,還可以用來開發第三層應用程序。如可以把商業邏輯用單獨的程序表示;而這些程序在單個商業事務上協同工作。從而達到 業務邏輯與技術平臺分離的目的,簡化應用程序的開發過程。同時,也讓應用程序有了更高的靈活性與擴展性。
【編輯推薦】