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

关于开放式并发的一个奇怪的问题
最近在写一个基于web   service的应用程序,碰到了一个奇怪的问题。    
    功能比较简单,定义了一个EducationData类,它直接与数据库进行交互,完成数据的读写、更新等操作,一个web   service类EducationService,它只是简单的调用EducationData类中相应的方法,向用户公开公开了
    GetEducationData、UpdateExam等方法。
    在客户端调用web   service没有问题,数据读取,更新一切都正常,但在有数据并发冲突的时候出现了问题。
    EducationData类中,UpdateExam实现大致是这样的:并发采用的策略是与数据库中的原始值比较,若在更新时有冲突发生(更新出现错误,在数据库中找到该条数据,一同反馈给用户,我做了一个弹出窗口,包括原始数据和当前数据,供用户选择如何处理),主要代码如下:

      private   SqlDataAdapter   daExam;
      private   SqlDataAdapter   daConflict;
      private   DataSet   dsConflict;
   
      daExam.RowUpdated   +=   new   SqlRowUpdatedEventHandler(OnRowUpdated);

      public   DataSet   UpdateExam(DataSet   dsExam)
                {
                        try
                        {
                                daExam.Update(dsExam,   "Exam ");
                                dsExam.Merge(dsConflict,   true);
                        }
                        catch   (DBConcurrencyException   dbEx)
                        {
                                EventLogHelper.LogError(dbEx.Message);                              

                        }
                        return   dsExam;
                }

        private   void   OnRowUpdated(object   sender,   SqlRowUpdatedEventArgs   e)
                {
                        if   ((e.Status   ==   UpdateStatus.ErrorsOccurred)   &&       (e.Errors.GetType()   ==   typeof(DBConcurrencyException)))
                        {
                                daConflict.SelectCommand.Parameters[0].Value   =   e.Row[ "ID "];
                                int   count   =   daConflict.Fill(dsConflict,   "Exam ");

                                if   (count   ==   1)
                                {
&