# VFP本地表远程表同时事务处理

VFP双表事务处理,双表是指本地表和远程表同时加上事务,这样本地表和远程表,要么同时成功,要么同时失败。 ​

事务是为了保证所处理数据的完整性,如n个相关表被同时修改,在保存数据时,要么全部保存,要么都不保存,这只有用事务来实现。 ​

举例: 入库单增加了一个物料,库存表的相应也应该增加。如果入库单保存成功,库存表没有保存成功,便会出现数据不一致。而加上事务之后,如果库存表没有保存成功,入库单的数据也会回滚,便不保存。 ​

用try结构来处理事务,比用IF每句判断要简单明快得多,我见过许多人写的事务,那个就复杂,看得头晕晕的。 ​

VFP双表事务


Begin Transaction  &&临时表事务
Try   
  
	SQLSetprop(nDatasource,'transactions',2)    &&手动事务处理
	
  *-- 此处保存的相关代码  
	
	Sqlcommit(nDatasource)
	SQLSetprop(nDatasource,'transactions',1)    &&自动事务处理
	End Transaction  &&临时表事务结束
	
Catch To ex
	ROLLBACK 
	Sqlrollback(nDatasource) &&出错了,则事务回滚
	SQLSetprop(nDatasource,'transactions',1)    &&自动事务处理	
	?ex.Message
Endtry

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

在框架中,想要协调DAL_CA与MSSQLhelper同时拥有事务,只要他们在同一个句柄下就可以操作啦。

oDBSQLhelper=newobject("mssqlhelper","mssqlhelper.prg")

?oDBSQLhelper.datasource  && mssqlhelper自动创建的句柄

oDAL_CA=newobject("dal_ryxx","dal_ryxx.prg","",oDBSQLHelper.datasource)

oDBSQLhelper2=newobject("mssqlhelper","mssqlhelper.prg","",oDBSQLHelper.datasource)

1
2
3
4
5
6
7
8

这样oDBSQLhelper,oDAL_CA,oDBSQLhelper2 都处于同一句柄,随时开启事务,一起愉快玩耍。 对了,在框架中,其实连事务都可以不用写,直接SAVE就好。