remoting的客户端没有正常退出,会不会影起数据库死锁

mqmmx 2006-09-26 11:07:10
我用oracle10g, remoting用iis部属在本机,客户端也在本机。客户端在处理事务时,中间我调试时强制退出,远程对象为什么没有自动回滚呢?
正常运行时没问题,我会捕到错再回滚的,不用remoting时好象我中间强退也会回滚的,是不是remoting生命周期的问题?我没有在服务端设生命周期,那默认应该是什么多久呢?怎么才能让我在程序非常退出时回滚操作呢?
我初学remoting,希望回答详细些, 谢谢
...全文
469 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenyunfan 2006-12-20
  • 打赏
  • 举报
回复
本人这段时间也正在做一个Remoting的项目,关注一下呵呵!看了楼主的事务处理方式个人觉得是有问题的,数据库事务应该完全由中间层Remoting来完全控件,而不应该和客户端发生任何关系(也就是说客户端是绝不能来调什么begintran之类的方法的)!
chenyunfan 2006-12-20
  • 打赏
  • 举报
回复
mark
mqmmx 2006-10-29
  • 打赏
  • 举报
回复
错了,试的方法不对,客户端激活也不行的,再没人答过几天结贴吧
mqmmx 2006-10-29
  • 打赏
  • 举报
回复
又看了几篇remoting激活方法的文章,试了一下客户端激活,原来这个可以。但原因不是很明白,还有就是,用客户端激活,没办法用原来的部署方法(原来我是客户端用接口,服务商才是真正的类。)看的几篇文章中都只说用建同样但没有内容的类来骗remoting,不知有没有更好的方法。
mqmmx 2006-10-17
  • 打赏
  • 举报
回复
只是学习一下,我随时都能把remoting变为本地的dll文件,只是想看看是不是能解决这个问题,
oldhunter 2006-10-16
  • 打赏
  • 举报
回复
这种设计不合理,必定会带来一些麻烦的.
mqmmx 2006-10-12
  • 打赏
  • 举报
回复
为什么在客户端处理事务?

=============================================================
我也知道把商务层也放在服务端好些,但商务层是多变的,用户的要求千奇百怪,有时数据表都要改,把商务层也放在服务端改程序不方便,调试也很不方便


数据处理的事务与Remoting 有关么?
=================================================================
我在数据层(也就是remoting服务)开放了BeginTrace() RollbackTrace() CommitTrace()几个方法用于处理事务,
当执行了BeginTrace()方法后,远端对当前连接建了个事务,RollbackTrace()或CommitTrace()方法后把事务结束并关闭连接.
客户端运行时也都是放在一个事件中做的,对数据处理方面,如执行Update语句等遇错远程remoting捕捉后会执行RollbackTrace()方法,其它错我也会在客户端捕捉并执行RollbackTrace()方法.
但如我调试时在事处开始后设断点,在断点处强退就会引启当前事务一直保持锁的状态.

现在我想要的就是当客户端强退后当前实例过了生命周期能断开联接,但没有实现,remoting过了生命周期远程实例不会被回收吗?
另我的remoting继承了IDispose接口,在Dispose方法时会判断是否有事务回滚并关闭连接
zhongwanli 2006-10-12
  • 打赏
  • 举报
回复
为什么在客户端处理事务?

数据处理的事务与Remoting 有关么?

lingbo_wx 2006-10-08
  • 打赏
  • 举报
回复
mark
oldhunter 2006-10-01
  • 打赏
  • 举报
回复
这几天我也在用remoting,遇到一些问题,很奇怪,顺便也让楼主看一下吧.
http://community.csdn.net/Expert/topic/5059/5059851.xml?temp=.7743189
oldhunter 2006-10-01
  • 打赏
  • 举报
回复
你的代码在服务器端,客户端断线跟服务器端正在执行的代码没有关系啊.
例如客户端调你的Opearation方法:
public void Operation()
{
try
{
数据操作代码...
}
catch
{
执行到这里就回滚了,就是客户机断了,这里一样执行.
}
}
copine 2006-09-30
  • 打赏
  • 举报
回复
你看一下你remoting对象的激活方式,我记得有三种激活方式,其中一种应该是断开连接,生命周期就结束了。
xingyaohua 2006-09-30
  • 打赏
  • 举报
回复
up
mqmmx 2006-09-30
  • 打赏
  • 举报
回复
我前面说了,我用的就是SingleCall,另一种也试了,两种的结果是一样的。另外异常我是捕捉的,我就是像说,万一个客户端在程序运行事务时突然掉电或系统崩溃时能有什么方法把当前事务自动回滚

lxhvc() 说的“回收应用程序池就能回复”代码怎么处理
copine 2006-09-30
  • 打赏
  • 举报
回复
那可能就是两种,应该用singlecall,我也不熟,只是给你提个醒。
mqmmx 2006-09-30
  • 打赏
  • 举报
回复
我怎么只看到两种SingleCall和Singleton
jc15271149 2006-09-29
  • 打赏
  • 举报
回复
up
mmens 2006-09-29
  • 打赏
  • 举报
回复
Mark
lxhvc 2006-09-27
  • 打赏
  • 举报
回复
因为remoting是托管在iis上的,iis是采用连接池来管理连接的,当你强制退出系统时连接池不会销毁当前连接,所以持续死锁。回收应用程序池就能回复,不需要重启。另外在程序中要尽量考虑异常回滚,避免这种死锁产生。
mqmmx 2006-09-27
  • 打赏
  • 举报
回复
是我写得不清楚,有人不明白。

我把数据处理层作为服务端部署为remoting的服务端(因为它是相对固定的,很少改),其中有事务处理方法。我的数据层继承了IDisposable接口,在Dispose方法中我写了判断是否有事务并回滚此事务,断开联接。但我调试时强退是不是没有运行到服务端的Dispose方法,所以没有回滚呢?服务端是wellknown mode="SingleCall"

我想要的只是,客户端在过了生命周期后Disconnect的处理,有什么方法可以重写并入我要的内容。
还有就是,是不是服务端在本机的关系,我强退后退出所有工程等了2分钟事务也没有回滚,死锁还在,不用命令死锁解不开,但重启本机到是自动回滚了为什么?
加载更多回复(4)

12,162

社区成员

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

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