攻关大课题,在c/s开发模式中,多用户对服务器中的单表对应的远程视图如何避免更新冲突

wlzhanglb 2003-08-24 10:29:37
在c/s模式中,服务器端是vfp8.0,开发端是 VFP8.0
在开发端利用远程视图控制服务器内的基表,若有多个用户在同一时间内,想要添加新的记录,在各自的Tableupdate(.t.)语句中,如何避免服务器内增加相重的记录.

例如:用户1 append blank
repl 字段 with 变量
同一个时刻,用户2: append blank
repl 字段 with 变量
在各自的tableupdate(.t.)语句中,有可能向服务器添加相同的一条记录.
如何来处理?
这是个c/s开发过程中,比较突出的问题,请各位赐教?
谢谢!



...全文
60 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
noproblem12 2003-11-24
  • 打赏
  • 举报
回复
在server段设定唯一字段,如果用户在更新的时候记录不是唯一的那么就更新失败

再就是启用事务处理
这是MSDN上关于事务处理的例子
保护远程更新
在对远程表进行数据更新的过程中,事务处理可以避免系统造成的错误。下面的示例使用了事务处理来缓冲对远程表的数据写入操作。

远程表事务处理示例

代码 注释
hConnect = CURSORGETPROP('connecthandle')
SQLSETPROP(hConnect, 'transmode',
DB_TRANSMANUAL)
获得连接句柄。
启用人工事务处理。
lSuccess = TABLEUPDATE(.T.,.F.)
IF lSuccess = .F
=SQLROLLBACK (hConnect)
非强制更新所有记录。
如果更新失败,
回滚临时表关于连接的事务处理。
=AERROR(aErrors)
DO CASE
CASE aErrors[1,1] = 1539
...
CASE aErrors[1,1] = 1581
...
CASE aErrors[1,1] = 1582
...
CASE aErrors[1,1] = 1585
nNextModified = GETNEXTMODIFIED(0)
DO WHILE nNextModified <> 0
GO nNextModified
从 AERROR( ) 中获得错误信息。

如果是触发器失败,进行相应处理。

如果是字段不接受 null 值,进行相应处理。

如果是违反了字段有效性规则,进行相应处理。

如果是记录已被其他用户修改,进行相应处理。

从第一个记录开始,循环遍历所有已修改字段。
FOR nField = 1 to FCOUNT()
cField = FIELD(nField)
IF OLDVAL(cField) <> ;
CURVAL(cField)
nResult = MESSAGEBOX;
("数据已经被其他用户 ;
修改。 ;
保留修改吗?",4+48,;
"被修改的记录")
检查每个字段是否更改。

比较缓冲值和磁盘上的值,然后显示对话框。
IF nResult = 7
=TABLEREVERT(.F.)
ENDIF
EXIT
ENDIF
ENDFOR
nNextModified = ;
GETNEXTMODIFIED(nNextModified)
ENDDO
如果用户响应“No”,
还原一个记录。

脱离“FOR nField...”循环。


获得下一个已修改的记录。
=TABLEUPDATE(.T.,.T.)
=SQLCOMMIT(hConnect)
CASE aErrors[1,1] = 109
...
CASE aErrors[1,1] = 1583
...
CASE aErrors[1,1] = 1884
...
OTHERWISE
强制更新所有未还原记录。
提交事务处理。
如果记录正由其他用户使用,进行相应处理。

如果违反行规则,进行相应处理。

如果违反唯一索引规则,进行相应处理。

否则,出现对话框。
=MESSAGEBOX( ;
"Unknown error message: " ;
+ STR(aErrors[1,1]))

ENDCASE
ELSE
=SQLCOMMIT(hConnect)
ENDIF


提交事务处理(结束事务处理)。
yuxi81 2003-11-22
  • 打赏
  • 举报
回复
我也正在考虑这个问题。
面临的项目就是C/S模式。
本地表可以用flock()来锁定表,但是使用remote_view时不知道可以不可以使用,对视图所对应的基表是不是也可以锁定.
如可以的话,那么只要在修改表的时候检查一下相同记录的存在情况应该就差不多了
mgan 2003-08-24
  • 打赏
  • 举报
回复
我只知道思路
就是 设置在用户提交时只能一个一个的提交
然后在提交时候验证记录中是否有相同的存在
这在 好多上面有这个例子 但是VFP上的我还没有看到过啊
fj_jiangqi 2003-08-24
  • 打赏
  • 举报
回复
锁定操作
lock("0",别名) &&锁定表头
锁定表头后再进行操作,操作后还用
unlock record 0 in 别名
进行解锁。
这是vfp里的功能,不知在你的c/s中是否可以用。我想能用replace命令应该也是能够用的。
试试看吧!!!
-------------------------
我流落在凄凉的世界里-孤苦伶仃
我过着动荡无助的生活-四处漂泊
pecker 2003-08-24
  • 打赏
  • 举报
回复
你能问出这样的问题,已经不需要我的帮助了.
fj_jiangqi 2003-08-24
  • 打赏
  • 举报
回复
vfp在这方面处理我知道的不是太多,在java中要对记录维护操作必须先锁定。
sql必须这样:select * from tablename where ... for update
在背后须加一个for update进行锁定。
关于关键字段,在sql服务中有自增序号字段,在oracle中可这关键字段加一个序列号来引用,这样就可以避免关健字段重复的问题。
也许不是你想要的,或许我错了……
-------------------------
我流落在凄凉的世界里-孤苦伶仃
我过着动荡无助的生活-四处漂泊

2,723

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧