QQ邮箱收其他邮箱邮件不留底
来源:网络发布时间:2009-08-26
IF Isuccess=.F. &&若失败
oROLLBACK &&取消修改,结束事务1
o=AERROR(aErrors) &&取消事务出错
oDO CASE
CASE aErrors[1,1]=1585
&&当前记录被其他用户改过
=RLOCK() &&记录加锁
FOR nField=1 to FCOUNT()
&&依次处理每一字段
cField=FIELD(nField)
IF OLDVAL(cField)<>CURVAL(cField)
o&&字段被改过,确认修改无效,恢复原记录
o=TABLEREVERT(.F.)
oUNLOCK
oEXIT
oENDIF
oENDFOR
oBEGIN TRANSACTION &&开始事务2
o=TABLEUPDATE(.T.,.T.) &&强制更新数据
oEND TRANSACTION &&结束事务2
oUNLOCK
ENDCASE
ELSE
END TRANSACTION &&结束事务1
ENDIF
4 事务处理实现远程表的数据更新 当使用远程表中的数据时,事务处理只更新视图临时表的本地备份,对远程基表的更新不起作用。使用SQLSETPROP()启动人工事务,SQLROLLBAK()和SQLCOMMIT()控制事务处理。
在自定义类—TRANSACTION中增加方法远程表事务处理确认—RTRANSCONFIRM和取消(—RTRANSCANCEL)两种方法。同样共享数据的各个用户程序也使用行缓冲。
— RTRANSCONFIRM 方法
LPARAMETERS hConnect &&连接句柄
SQLSETPROP(hConnect,'transmode',DB—TRANSMANUAL)
Isuccess=TABLEUPDATE(.T.,.F.)
&&非强制的更新所有修改记录
IF Isuccess=.F. &&若失败
oROLLBACK &&取消修改,结束事务1
o=AERROR(aErrors) &&取消事务出错
oDO CASE
CASE aErrors[1,1]=1585 &&当前记录被其他用户改过
=RLOCK() &&记录加锁
FOR nField=1 to FCOUNT()
&&依次处理每一字段
cField=FIELD(nField)
IF OLDVAL(cField)<>CURVAL(cField)
&&字段被改过,确认修改有效
DO CASE
oCASE TYPE(cField)='N'
oT1=CURVAL(cField)-LDVAL(cField)
oREPL cField WITH T1+EVAL(cField))
oOTHEWISE
oREPL cField WITH CURVAL(cField))
oENDCASE
ENDIF
ENDFOR
UNLOCK
=TABLEUPDATE(.T.,.T.) &&强制更新数据
SQLCOMMIT(hConnect) &&提交事务
ENDCASE
oELSE
oSQLCOMMIT(hConnect) &&提交事务
oENDIF
o— RTRANSCANCEL 方法
LPARAMETERS hConnect &&连接句柄
oSQLSETPROP(hConnect,'transmode',DB—TRANSMANUAL)
oISuccess=TABLEUPDATE(.T.,.F.)
o&&非强制的更新所有修改记录
oIF Isuccess=.F. &&若失败
ROLLBACK &&取消修改,结束事务1
=AERROR(aErrors) &&取消事务出错
DO CASE
oCASE aErrors[1,1]=1585 &&当前记录被其他用户改过
o =RLOCK() &&记录加锁
oFOR nField=1 to FCOUNT()
o&&依次处理每一字段
ocField=FIELD(nField)
oIF OLDVAL(cField)<>CURVAL(cField)
&&字段被改过,确认修改无效,恢复原记录
=TABLEREVERT(.F.)
UNLOCK
ENDIF
ENDFOR
=TABLEUPDATE(.T.,.T.) &&强制更新数据
SQLCOMMIT(hConnect) &&提交事务
ENDCASE
oELSE
oSQLCOMMIT(hConnect) &&提交事务
oENDIF
5 效果 事务处理自定义类—TRANSACION已经在VFP5.0环境下调试通,使用效果良好。可以根据需要修改类或创建新的类,如创建采用开放式表缓冲时事务处理的类。如果在事务处理过程中出现断电或其他系统中断情况,数据更新将失败,此时的数据恢复由操作系统的事务处理跟踪系统解决
【纠错】