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