目前采用開放式系統的銀行柜面業務處理系統,基本都是客戶/服務器結構的,客戶端需要通過介質多樣的廣域網與服務端通訊。由于網絡的不可靠性,常常出現傳輸過程中交易數據的丟失,造成客戶端與服務端的交易不完整或數據不一致,導致銀行的資金風險和信譽風險。如何防范由于通訊原因產生的風險,如何控制數據的一致性,是任何一個客戶/服務器結構的聯機交易處理系統必須考慮的問題。
一、 導致數據不一致的原因
在客戶/服務器結構的聯機交易處理系統中,一筆交易至少包含如下圖所示的四個過程:①請求傳輸過程;②服務端交易處理過程;③應答傳輸過程;④客戶端處理應答過程。 php3?id=0000000029&name=tu16.gif" width=510>
圖表 1 交易的基本處理過程
由于網絡傳輸的不可靠性,必然有"③應答傳輸過程" 失敗的情況。在這種情況下,就產生了服務端與客戶端交易狀態的不一致性問題:在服務端,該筆交易已處理或完成;在客戶端,由于沒有收到應答,該筆交易是失敗的。
這種客戶端及服務端的不一致性,會給銀行帶來資金風險和信譽風險。當該筆交易是增加客戶的可用資金時,產生了資金風險,當該筆交易是減小客戶的可用資金時,產生了信譽風險。例如一筆存款交易產生數據不一致時,在服務端,客戶的帳戶余額已增加,而在柜臺,該筆業務失敗,存款并末收入,從而造成客戶的余額虛增,客戶可以通過正常的途徑使用該筆資金,這將造成銀行資金損失。一筆取款交易產生數據不一致時,在主機端,客戶的帳戶余額已減少,而在柜臺,該筆業務失敗,客戶并未取到款。如果客戶發現這一情況,將會造成銀行的信譽損失。
二、 沖正與重復辦理方式
目前大部分銀行業務處理系統采用沖正或重復辦理的方式,了解決數據不一致的問題。這兩種方式的基本思想,都是當數據不一致性問題發生后,通過事后附加的干預過程來進行補救。
(一) 沖正方式
沖正方式下,一筆交易以客戶端為準,客戶端完成,該筆交易才完成,客戶端失敗,則該筆交易失敗。當應答傳輸過程失敗,前端認為該筆交易失敗,將產生一筆沖正交易。該筆沖正交易將取消上一筆交易的結果,從而恢復客戶端及服務端的數據一致性。
按產生沖正交易的時機,可以分為三種:
1、立即沖正,是在一筆交易超時無應答時,立即發出沖正;
2、定時沖正,是指按固定的時間間隔,發出沖正交易;
3、當一筆交易未成功時,在做下一筆交易時,先自動做一個沖正交易,當沖正交易完成后,才執行正常交易。目前,POS系統廣泛使用的是下一筆交易沖正的方式。
沖正方式程序控制簡單,適應性廣。但這種方式無法確保沖正成功的時間,從而也就無法控制風險存在的時間。一個極端的情況是,通訊故障是由于物理線路中斷造成的,在線路恢復正常前,沖正交易無法完成,風險將一直存在。
(二)重復辦理方式
重復辦理方式下,一筆交易以服務端為準,服務端處理成功,無論客戶端是否收到結果,均認為該筆交易成功。當應答傳輸過程失敗造成客戶端交易失敗,客戶端必須重復辦理該筆交易,在服務端,收到重復的交易請求,若該筆交易已處理,則將上筆交易的結果作為本次交易的處理結果返回,若未處理,則按正常交易進行處理。
這種方式的優點在于控制簡單,易于實現。局限性基本同沖正方式,即無法控制風險存在的時間。另外,以服務端為準的條件使它的使用范圍受到一定的限制。在對公會計系統中,通常采用重復辦理的方式。
三、鎖方式
鎖方式是將數據的不一致性轉換為數據的不可用性,通過數據的不可用性,消除風險的產生。
鎖方式具體的實現方法是:在②服務端處理過程后,對該操作所涉及的數據加鎖,使它們處于一種不可用的狀態;增加⑤確認傳輸過程和⑥服務端確認處理過程。當客戶端收到應答并處理完畢后,將產生給服務端發一個確認信息,當服務端收到確認后,對第②步鎖住的數據進行解鎖。如下圖所示:
圖表 2 鎖方式的處理過程
通過上圖可以看出,在t1~t4 的時間段內,該筆交易所涉及的數據是加鎖的。當③應答傳輸過程失敗時,則不會執行第⑥步的解鎖操作。后續涉及這些數據的交易將由于鎖的存在而不再進行,因此,不會造成銀行的資金損失及信譽損失。
加鎖常用兩種實現方式:對數據庫交易加鎖的數據庫鎖,在應用層對數據加鎖的應用鎖。鎖方式可以根據實際情況決定使用數據庫鎖或應用鎖。
(一)數據庫鎖
數據庫鎖利用關系數據庫中提供的交易機制對數據進行加鎖保護。
數據庫操作中,"開始交易(begin work)"和"提交交易(commit work)"之間的操作所涉及的數據將被加鎖。在②服務端交易處理過程中執行"開始交易"操作,在⑥服務端確認處理過程執行commit work操作。這樣從t1至t4之間,數據是被鎖住的。當應答傳輸過程失敗時,相關的數據被鎖住,與這些數據相關的后續業務將由于鎖的存在而無法進行,這樣就不會造成數據不一致的問題。
這種方式避免了風險的產生,程序編寫簡單,易于使用。但是,數據庫的鎖要占用比較大的系統資源;數據被鎖的時間較長,數據庫的交易對數據的鎖范圍較大,沒有針對性。因此,數據庫的鎖對系統支持大規模并發的能力會產生負面影響。過程③和過程⑤的任何一次失敗均會導致交易無法結束,從而也就無法釋放相應的資源及數據,從而影響后續業務的處理。
為了避免出現無法釋放資源的現象,有些系統采用了結束交易的默認機制。當交易超過一定的時間未結束時,則系統根椐約定,自動進行"提交交易"或"回滾交易(Rollback)"。這種作法實際上可能造成客戶端與服務端的數據不一致,使用這種方式的系統一般都具有一個交易中間件,由交易中間件通過XA接口,執行數據庫的交易開始及交易結束等與交易有關的操作。
(二)應用鎖
應用鎖與數據庫鎖的差別在于,應用鎖方式是在應用程序這一層對數據進行加鎖。例如一筆存款業務,在第②步服務端完成業務處理后,對進行存款的帳戶進行凍結,使其不能發生業務,直到收到客戶端發來的確認后,才對該帳戶解凍。
應用鎖的系統開銷小,鎖的針對性強,系統的并發能力大。但是應用編程復雜,編程量增加,有時很難確定一筆交易應當鎖住的數據。
三、 TongEASY方案:鎖與自動確認/沖正結合
從銀行業務角度來看,控制風險是首要的,因此一個方案首先必須實現對風險的有效控制。雖然鎖方式可以有效地控制風險,但這種方式對系統處理能力及效率會有一定的影響,如何將這種方式對系統的影響控制在可以接受的范圍,是解決問題的關鍵所在。
通科技公司的交易中間件TongEASY綜合上述幾種方式的優點,提供了一種解決數據一致性問題的方案,即鎖與自動確認/沖正結合的方式:利用鎖方式控制數據一致性問題,利用確認/沖正方式釋放鎖占用的資源。
TongEASY以鎖方式為基礎,增加以第⑦個處理過程:確認/沖正的應答傳輸過程。當服務端接收到客戶端的確認/沖正后,服務端將發回一個確認/沖正的應答。TongEASY只有在收到確認/沖正的應答后,才認為該筆交易已處理結束,否則將重復發確認/沖正。處理過程如下圖所示:
圖表 3 TongEASY的處理過程
當③應答傳輸過程失敗時,TongEASY將產生一個"沖正確認"發給服務端,服務端收到"沖正確認"后,則進行沖正操作,取消該筆交易的操作。當⑤確認傳輸過程或⑦確認應答傳輸過程失敗時,TongEASY將核對交易結果并按一定的時間間隔重復執行⑤確認傳輸過程,直到過程⑤及⑦均正常完成為止。服務端在進行⑥確認處理過程時,若收到的確認是"正常確認",則對相關數據解除應用鎖;若收到的確認是"沖正確認",則對相關數據解除應用鎖并進行沖正操作。若收到的"確認"已處理過,則直接發回確認應答信息。
TongEASY方式相對于鎖方式而言,避免了由于單次通訊故障造成資源無法釋放,在解決數據不一致性問題的同時,減少了系統資源占用現象,避免了系統在長時間運行后,由于大量資源無法釋放而造成系統的性能下降。
四、 結束語
沖正方式及重復辦理方式雖然簡單、方便,但卻無法防止風險的產生,無法有效控制風險存在時間。
數據庫鎖及應用鎖的方式可以防止風險的產生,但對系統的運行效率,特別是會影響系統支持大規模并發的能力,在極端的情況下,會影響系統的正常使用。
TongEASY提供的鎖與沖正結合的方式是對鎖機制的一種改進,它不但可以防止風險的產生,同時可以減少由于通訊故障造成的資源占用,不失為一種適合中國國情的解決方法。