上次說明了客戶端如何把變化的數據更新到服務器端,但是在實際應用中,往往是要同時更新若干個表,
為了保證邏輯上一致,這些表的操作要么都一次成功,要么全部失敗,這就需要使用事務處理。我們今天
就來說一下,怎么在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 出問題,另外一個會跟着失敗,保證了數據的一致性。