日期:2014-05-19  浏览次数:20471 次

关于asp.net下的并发处理问题,急,给出200分
目前使用Sybase后台数据库,前台使用asp.net,在处理并发操作的时候(如两个用户同时按下“保存”按钮),系统将出现如下的错误(一方可以正确的保存,另外一方出现错误):

  要插入的节点出自不同的文档上下文。
说明:   执行当前   Web   请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息:   System.ArgumentException:   要插入的节点出自不同的文档上下文。

源错误:

执行当前   Web   请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。

堆栈跟踪:

[ArgumentException:   要插入的节点出自不同的文档上下文。]
      System.Xml.XmlNode.AppendChild(XmlNode   newChild)   +575
      ISNet.Serialization.XmlSerialization.XmlSerializer.ߵ(XmlNode   ݡ,   Object   ێ)
      ISNet.Serialization.XmlSerialization.XmlSerializer.߱(Object   ێ)
      ISNet.Serialization.XmlSerialization.XmlSerializer.ࠗ()
      ISNet.Serialization.XmlSerialization.XmlSerializer.Serialize(Object   ߡ)
      ISNet.WebUI.ISNetControl.GetXMLData()
      ISNet.WebUI.WebControls.WebInput.GetXMLData()
      ISNet.WebUI.ISNetControl.OnPreRender(EventArgs   ԍ)
      ISNet.WebUI.WebControls.WebInput.OnPreRender(EventArgs   e)
      System.Web.UI.Control.PreRenderRecursiveInternal()
      System.Web.UI.Control.PreRenderRecursiveInternal()
      System.Web.UI.Control.PreRenderRecursiveInternal()
      System.Web.UI.Page.ProcessRequestMain()


版本信息:   Microsoft   .NET   Framework   版本:1.1.4322.2300;   ASP.NET   版本:1.1.4322.2300

------解决方案--------------------
那就用 Application 写一个 “锁”吧,如果有人操作了这个表,就把这个表“锁”住,操作完了再打开。

是在程序里面作限制,而不是在数据库里作限制。

一个人保存时,另一个人在保存就提示说“另一个人在操作,请您稍后再试!”
------解决方案--------------------
一个人操作时
Application[ "表名 "] = "lock "

操作完成后
Application[ "表名 "] = "unlock "


另一个人操作前先判断 Application[ "表名 "]

注意:如果发生异常的话,要把锁打开。



------解决方案--------------------
在程序开头插入一个全局变量:
Application[ "locktable "]=true;
//不能用session......
把 CM.ExecuteNonQuery()
改成:
while(application[ "locktable "]){
Application[ "locktable "]=false;
CM.ExecuteNonQuery();

}
Application[ "locktable "]=true;


------解决方案--------------------
做线程,也是锁程序,保存的程序段只能同时一个人执行,就不会出现错误了;(按理来说你这样的情况应该是不会报错的,估计是你的数据库主键设置造成唯一性的问题)