伺服器與客戶端交易資料的一致性解決

2021-08-29 08:20:39 字數 2983 閱讀 8634

在客戶/伺服器結構的聯機交易處理系統中,一筆交易至少包含如下圖所示的四個過程:①請求傳輸過程;②服務端交易處理過程;③應答傳輸過程;④客戶端處理應答過程。

圖表 1 交易的基本處理過程

由於網路傳輸的不可靠性,必然有"③應答傳輸過程" 失敗的情況。在這種情況下,就產生了服務端與客戶端交易狀態的不一致性問題:在服務端,該筆交易已處理或完成;在客戶端,由於沒有收到應答,該筆交易是失敗的。

這種客戶端及服務端的不一致性,會給銀行帶來資金風險和信譽風險。當該筆交易是增加客戶的可用資金時,產生了資金風險,當該筆交易是減小客戶的可用資金時,產生了信譽風險。例如一筆存款交易產生資料不一致時,在服務端,客戶的帳戶餘額已增加,而在櫃檯,該筆業務失敗,存款並末收入,從而造成客戶的餘額虛增,客戶可以通過正常的途徑使用該筆資金,這將造成銀行資金損失。一筆取款交易產生資料不一致時,在主機端,客戶的帳戶餘額已減少,而在櫃檯,該筆業務失敗,客戶並未取到款。如果客戶發現這一情況,將會造成銀行的信譽損失。

二、 沖正與重複辦理方式

鎖方式是將資料的不一致性轉換為資料的不可用性,通過資料的不可用性,消除風險的產生。

鎖方式具體的實現方法是:在②服務端處理過程後,對該操作所涉及的資料加鎖,使它們處於一種不可用的狀態;增加⑤確認傳輸過程和⑥服務端確認處理過程。當客戶端收到應答並處理完畢後,將產生給服務端發乙個確認資訊,當服務端收到確認後,對第②步鎖住的資料進行解鎖。如下圖所示:

圖表 2 鎖方式的處理過程

通過上圖可以看出,在t1~t4 的時間段內,該筆交易所涉及的資料是加鎖的。當③應答傳輸過程失敗時,則不會執行第⑥步的解鎖操作。後續涉及這些資料的交易將由於鎖的存在而不再進行,因此,不會造成銀行的資金損失及信譽損失。

加鎖常用兩種實現方式:對資料庫交易加鎖的資料庫鎖,在應用層對資料加鎖的應用鎖。鎖方式可以根據實際情況決定使用資料庫鎖或應用鎖。

(一)資料庫鎖

資料庫鎖利用關聯式資料庫中提供的交易機制對資料進行加鎖保護。

資料庫操作中,"開始交易(begin work)"和"提交交易(commit work)"之間的操作所涉及的資料將被加鎖。在②服務端交易處理過程中執行"開始交易"操作,在⑥服務端確認處理過程執行commit work操作。這樣從t1至t4之間,資料是被鎖住的。當應答傳輸過程失敗時,相關的資料被鎖住,與這些資料相關的後續業務將由於鎖的存在而無法進行,這樣就不會造成資料不一致的問題。

這種方式避免了風險的產生,程式編寫簡單,易於使用。但是,資料庫的鎖要占用比較大的系統資源;資料被鎖的時間較長,資料庫的交易對資料的鎖範圍較大,沒有針對性。因此,資料庫的鎖對系統支援大規模併發的能力會產生負面影響。過程③和過程⑤的任何一次失敗均會導致交易無法結束,從而也就無法釋放相應的資源及資料,從而影響後續業務的處理。

為了避免出現無法釋放資源的現象,有些系統採用了結束交易的預設機制。當交易超過一定的時間未結束時,則系統根椐約定,自動進行"提交交易"或"回滾交易(rollback)"。這種作法實際上可能造成客戶端與服務端的資料不一致,使用這種方式的系統一般都具有乙個交易中介軟體,由交易中介軟體通過xa介面,執行資料庫的交易開始及交易結束等與交易有關的操作。

(二)應用鎖

應用鎖與資料庫鎖的差別在於,應用鎖方式是在應用程式這一層對資料進行加鎖。例如一筆存款業務,在第②步服務端完成業務處理後,對進行存款的帳戶進行凍結,使其不能發生業務,直到收到客戶端發來的確認後,才對該帳戶解凍。

應用鎖的系統開銷小,鎖的針對性強,系統的併發能力大。但是應用程式設計複雜,程式設計量增加,有時很難確定一筆交易應當鎖住的資料。

三、 tongeasy方案:鎖與自動確認/沖正結合

從銀行業務角度來看,控制風險是首要的,因此乙個方案首先必須實現對風險的有效控制。雖然鎖方式可以有效地控制風險,但這種方式對系統處理能力及效率會有一定的影響,如何將這種方式對系統的影響控制在可以接受的範圍,是解決問題的關鍵所在。

通科技公司的交易中介軟體tongeasy綜合上述幾種方式的優點,提供了一種解決資料一致性問題的方案,即鎖與自動確認/沖正結合的方式:利用鎖方式控制資料一致性問題,利用確認/沖正方式釋放鎖占用的資源。

tongeasy以鎖方式為基礎,增加以第⑦個處理過程:確認/沖正的應答傳輸過程。當服務端接收到客戶端的確認/沖正後,服務端將發回乙個確認/沖正的應答。tongeasy只有在收到確認/沖正的應答後,才認為該筆交易已處理結束,否則將重**確認/沖正。處理過程如下圖所示:

圖表 3 tongeasy的處理過程

當③應答傳輸過程失敗時,tongeasy將產生乙個"沖正確認"發給服務端,服務端收到"沖正確認"後,則進行沖正操作,取消該筆交易的操作。當⑤確認傳輸過程或⑦確認應答傳輸過程失敗時,tongeasy將核對交易結果並按一定的時間間隔重複執行⑤確認傳輸過程,直到過程⑤及⑦均正常完成為止。服務端在進行⑥確認處理過程時,若收到的確認是"正常確認",則對相關資料解除應用鎖;若收到的確認是"沖正確認",則對相關資料解除應用鎖並進行沖正操作。若收到的"確認"已處理過,則直接發回確認應答資訊。

tongeasy方式相對於鎖方式而言,避免了由於單次通訊故障造成資源無法釋放,在解決資料不一致性問題的同時,減少了系統資源占用現象,避免了系統在長時間執行後,由於大量資源無法釋放而造成系統的效能下降。

四、 結束語

沖正方式及重複辦理方式雖然簡單、方便,但卻無法防止風險的產生,無法有效控制風險存在時間。

資料庫鎖及應用鎖的方式可以防止風險的產生,但對系統的執行效率,特別是會影響系統支援大規模併發的能力,在極端的情況下,會影響系統的正常使用。

tongeasy提供的鎖與沖正結合的方式是對鎖機制的一種改進,它不但可以防止風險的產生,同時可以減少由於通訊故障造成的資源占用,不失為一種適合中國國情的解決方法。

伺服器與客戶端

建立socket操作,建立流式套接字,返回套接字型大小socksrv socket socket int af,int type,int protocol 第乙個引數,指定位址簇 tcp ip只能是af inet,也可寫成pf inet socket socksrv socket af inet,s...

客戶端與伺服器

cs與bs 軟體使用方式上的兩種劃分 c s client server pc客戶端與伺服器架構 特點 在伺服器當中就主要是乙個資料庫,把所有業務邏輯都交給客戶端來完成 優點 較為安全,使用者介面豐富,客戶體驗好 缺點 每次公升級都要重新安裝,針對不同的作業系統開發,可移植性差 b sbrowser...

js解決客戶端與伺服器時間不一致的問題

最近在寫乙個專案時,要根據時間進行不同的展示,直接用new date gettime 獲取當前時間,結果就出問題了。有些使用者擅自修改自己的本地時間,導致獲取到的時間並不是當前時間,尷尬。既然如此,首先想到的就是讓本地時間以伺服器的時間為基準,只要讓伺服器傳乙個時間戳過來就可以了。那如何實現動態獲取...