上次说明了客户端如何把变化的数据更新到服务器端,但是在实际应用中,往往是要同时更新若干个表,
为了保证逻辑上一致,这些表的操作要么都一次成功,要么全部失败,这就需要使用事务处理。我们今天
就来说一下,怎么在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 dobegin Open; edit; fieldbyname('BMNAME').AsString:='测试部门'; post;end; with kbmMWClientQuery1 dobegin edit; fieldbyname('XM').AsString:='测试人名'; post;end; if kbmMWClientTransactionResolver1.Resolve([kbmMWClientQuery2,kbmMWClientQuery1]) thenbegin showmessage('更新成功');endelse showmessage('更新失败');end;
我们在服务器端监测sql 的执行,如下图
可以清楚的看见两个UPDATE 是在一个事务里面完成的,如果任意一个update 出问题,另外一个会跟着失败,保证了数据的一致性。