使用delphi 开发多层应用(九)客户端使用事务更新多个表数据到kbmMW服务器

  上次说明了客户端如何把变化的数据更新到服务器端,但是在实际应用中,往往是要同时更新若干个表,

为了保证逻辑上一致,这些表的操作要么都一次成功,要么全部失败,这就需要使用事务处理。我们今天

就来说一下,怎么在kbmMW中实现事务处理。同时也顺便讲一下kbmMW 里面命名查询(named query)的

使用,首先我们打开服务器端,在数据服务上增加一个TkbmMWIBDACQuery,如图

使用delphi 开发多层应用(九)客户端使用事务更新多个表数据到kbmMW服务器

设置它的connctionpool 为Form1.kbmMWIBDACConnectionPool1

resolver 为kbmMWIBDACResolver1

sql 为select * from BMB

keyfieldsnames  为 BMID

tablename 为 BMB

Published 为True

最后把name 改成BMB. 同时把Form1.kbmMWIBDACConnectionPool1的maxconnections 设为5.

好了,服务器端设置好了,可以编译并运行了。

 

现在打开客户端,增加一个TkbmMWClientQuery,并设置相应的参数

使用delphi 开发多层应用(九)客户端使用事务更新多个表数据到kbmMW服务器

注意其他参数与上一个kbmMWClientQuery 一样,唯一不同的就是在query 里面输入@bmb, 也就是直接调用服务器

端的query,这就是命名查询的使用方法,理论上,为了保证多层系统的可维护性,建议多使用命名查询,减少直接SQL 操作。

为了实现事务操作,我们还需要加一个TkbmMWClientTransactionResolver,

使用delphi 开发多层应用(九)客户端使用事务更新多个表数据到kbmMW服务器

并如图设置相关属性,最后为了说明事务操作,我们在“更新到后台”按钮里面改成以下代码:

    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 的执行,如下图

使用delphi 开发多层应用(九)客户端使用事务更新多个表数据到kbmMW服务器

可以清楚的看见两个UPDATE 是在一个事务里面完成的,如果任意一个update 出问题,另外一个会跟着失败,保证了数据的一致性。

 

 

 

上一篇:使用delphi 开发多层应用(五)第一个kbmMW 服务例子


下一篇:使用delphi 开发多层应用(八)客户端更新数据到kbmMW服务器