关于Web Service超时后的数据同步问题

TonyTonyQ 2006-04-06 06:50:39
期望的运行流程如下:
一个Web程序(aspx页面的)用户点击一个按钮,然后做一些数据库数据更新,接着调用WebService1,WebService1会更新另一个数据库里的一些数据,执行完后返回结果给Web程序,Web程序会更新WebService1的执行结果,再更新一些数据的状态(如果WebService1执行成功则更新数据,如果失败,则回滚所有数据库操作)


现在出现的问题:
如果WebService1超时的话,Web程序负责的数据会因为超时错误(等待超时),全部回滚;而WebService1则正常执行(只是执行时间过长,导致Web程序等待超时),所以更新了它所对应的数据。因此导致了数据的不同步。

以上情况并非程序错误,而是由于网络原因,服务器负载等问题,可能随机出现。

请问有什么好的解决方法吗?除了把超时时间设得尽量长外,还有没有更完美的解决方案。
至于说更新硬件环境来解决这种方法,暂时先排除在外,优先考虑软件方法解决。
...全文
472 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
xielongfei 2006-08-23
  • 打赏
  • 举报
回复
增加客户端超时时间
YourWebService yws = new YourWebService();
yws.Timeout = 300000; //300 seconds ==> 5 minutes
TonyTonyQ 2006-04-14
  • 打赏
  • 举报
回复
恩,基本了解了,谢谢楼上各位
Knight94 2006-04-14
  • 打赏
  • 举报
回复
to qzj(SoldierQ)

你的方法是调用一个Web Service Method去完成,而这个Method分三步做
4. web service 开始事务
5. web service 插入数据
6. web service 提交事务,返回

因此,你无法判断web service method做到哪一步,这样你无法rollback回去。

我给你的建议,是把这三步做成三个Web Service Method,由于耗时最多的是第二步,因此你可以判断第二步是否完成,从而决定要不要执行第三步,这样你就可以比较轻松的完成commit和rollback。
menuvb 2006-04-13
  • 打赏
  • 举报
回复
刚想到一个变态的想法。在WEB APP页面上定时调用SERVER端的事件。这样应该可以解决超时问题。就像定时刷新页面一样。
menuvb 2006-04-13
  • 打赏
  • 举报
回复
3. web app 呼叫 web service

你在这里调用web service是直接调用还是异步调用。如果直接调用。就有可能出现WEB APP超时的情况。不知道把超时时间设长点有没有用。

我觉得可以将
1. web app 开始事务
2. web app 插入数据
这二步也全部放在web service进行操作。这样就算WEB APP超时。WEB SERVICE的数据也还是统一的

我并不觉得 可以在WebApp1来控制WebService1的事务操作,因为都是不同的应用程序。

个人想法:)
levinknight 2006-04-13
  • 打赏
  • 举报
回复
用异步调用的时候要小心啊
stlwj 2006-04-12
  • 打赏
  • 举报
回复
试一试在web程序里加上事务处理。
stlwj 2006-04-12
  • 打赏
  • 举报
回复
超时不会抛出错误出来吗??
calmzeal 2006-04-12
  • 打赏
  • 举报
回复
用Session的话
VB6、delphi等客户端能正常调用么?
TonyTonyQ 2006-04-12
  • 打赏
  • 举报
回复
To Knight94(愚翁) :

你好像没理解我的意思,我的程序的操作步骤如下:
1. web app 开始事务
2. web app 插入数据
3. web app 呼叫 web service
4. web service 开始事务
5. web service 插入数据
6. web service 提交事务,返回
7. web app 插入另一条数据
8. web app 提交事务

web app和web service在不同的服务器上, 调用 web service 采用同步操作,也就是要等待 web service 返回结果,否则 web app 一直阻塞。

现在的问题是:
步骤3 等待 web service 时,发生网络超时, 则 web app 执行错误捕获,对步骤2插入的数据执行回滚。
而web service并没有发生错误,成功的执行了4,5,6步骤。

注意的是,web app的事务,对web service的操作没有任何影响。web app和web service是不同的程序集,没有任何内在关系。


所以,我觉得你说的方法无效,或者是我误解了你的方法,如果你觉得你的方法可行,麻烦请讲的更加具体一些。

也希望大家对 web service 调用时候的数据同步问题,进行讨论。
Knight94 2006-04-10
  • 打赏
  • 举报
回复
to WebApp1如何来控制WebService1的事务操作?

Web-Service:
1、创建一个事务:并保存Transaction到Session中
2、执行数据操作,使用上面创建好的事务,但并不提交事务;:
先从Session获得Transaction,然后绑定到执行的DBCommand上,然后执行Command。
3、提交事务。
先从Session获得Transaction,然后进行提交。

Web-App
分别调用Web-Service的三个方法,但是要通过Cookie来保证在同一个Session中。
TonyTonyQ 2006-04-10
  • 打赏
  • 举报
回复
To Knight94
WebApp1如何来控制WebService1的事务操作?
WebApp1和WebService1被部署在不同的服务器上,都执行各自的数据操作,创建各自的数据库连接。
WebApp1创建的事务,只能影响自己程序集里的数据库操作,能让他对WebService1的数据操作起作用?

还是说你的意思是创建“分布式事务”,而不是一般的数据库事务?
Knight94 2006-04-08
  • 打赏
  • 举报
回复
to 如果WebApp1等待WebService1操作超时,则会回滚所有的操作,则WebApp1等于没有执行任何数据库操作。而WebService1并没有执行错误,则完成了更新数据B的字段st为10的操作。

你可以在WebApp1来控制WebService1的事务操作,例如:
以上的是分三步操作,
1、创建一个事务;
2、执行数据操作,使用上面创建好的事务,但并不提交事务;
3、提交事务。

califord 2006-04-08
  • 打赏
  • 举报
回复
初学这个知识,并不知情哟
TonyTonyQ 2006-04-06
  • 打赏
  • 举报
回复
再说的明白点吧:

WebApp1更新数据A的字段state为3,然后调用WebService1,WebService1更新数据B的字段st为10,然后返回更新成功,接着WebApp1再更新数据C的字段Result为"OK"。

如果WebApp1等待WebService1操作超时,则会回滚所有的操作,则WebApp1等于没有执行任何数据库操作。
而WebService1并没有执行错误,则完成了更新数据B的字段st为10的操作。

因此这整个操作导致数据不同步。

12,162

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 Web Services
社区管理员
  • Web Services社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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