使用delphi 開發多層應用(九)客戶端使用事務更新多個表數據到kbmMW服務器


  上次說明了客戶端如何把變化的數據更新到服務器端,但是在實際應用中,往往是要同時更新若干個表,

為了保證邏輯上一致,這些表的操作要么都一次成功,要么全部失敗,這就需要使用事務處理。我們今天

就來說一下,怎么在kbmMW中實現事務處理。同時也順便講一下kbmMW 里面命名查詢(named query)的

使用,首先我們打開服務器端,在數據服務上增加一個TkbmMWIBDACQuery,如圖

設置它的connctionpool 為Form1.kbmMWIBDACConnectionPool1

resolver 為kbmMWIBDACResolver1

sql 為select * from BMB

keyfieldsnames  為 BMID

tablename 為 BMB

Published 為True

最后把name 改成BMB. 同時把Form1.kbmMWIBDACConnectionPool1的maxconnections 設為5.

好了,服務器端設置好了,可以編譯並運行了。

 

現在打開客戶端,增加一個TkbmMWClientQuery,並設置相應的參數

注意其他參數與上一個kbmMWClientQuery 一樣,唯一不同的就是在query 里面輸入@bmb, 也就是直接調用服務器

端的query,這就是命名查詢的使用方法,理論上,為了保證多層系統的可維護性,建議多使用命名查詢,減少直接SQL 操作。

為了實現事務操作,我們還需要加一個TkbmMWClientTransactionResolver,

並如圖設置相關屬性,最后為了說明事務操作,我們在“更新到后台”按鈕里面改成以下代碼:

    with  kbmMWClientQuery2 do
begin
Open;
edit;
fieldbyname('BMNAME').AsString:='測試部門';
post;
end;

with kbmMWClientQuery1 do
begin
edit;
fieldbyname('XM').AsString:='測試人名';
post;
end;

if kbmMWClientTransactionResolver1.Resolve([kbmMWClientQuery2,kbmMWClientQuery1]) then
begin
showmessage('更新成功');
end
else
showmessage('更新失敗');
end;

我們在服務器端監測sql 的執行,如下圖

可以清楚的看見兩個UPDATE 是在一個事務里面完成的,如果任意一個update 出問題,另外一個會跟着失敗,保證了數據的一致性。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM