ADO.NET如何知道发生了SQL Server并发冲突?

时间:2012-03-19 18:02:03

标签: ado.net concurrency sqldataadapter

我不明白ADO.NET如何识别并发冲突,除非它在“黑匣子”内部做了超出我所说的事情。

我在SQL Server 2000中的更新查询执行类似以下示例的操作,该示例已简化;如果客户端传递给存储过程的rowversion与数据库中的rowversion不匹配,则where子句将失败,并且不会更新任何行:

      create proc UpdateFoo
      @rowversion timestamp OUTPUT,
      @id int,
      @foodescription varchar(255)

      as UPDATE FOO set description = @foodescription
      where id = @id and rowversion = @rowversion;

      if @@ROWCOUNT = 1
           select @rowversion from foo where id = @id;

我创建一个SqlCommand对象并填充参数并将命令对象分配给SqlDataAdapter的UpdateCommand属性。然后我调用数据适配器的Update方法。

确实应该存在并发错误,因为我故意更改数据库行以强制执行新的rowversion。但ADO.NET如何知道这一点?它执行的操作不仅仅是执行命令吗?

在SqlDataAdapter的RowUpdated事件中会出现并发错误:

   MySqlDataAdapter += (sender, evt) =>
     {
       if ((evt.Status == UpdateStatus.Continue) && (evt.StatementType == StatementType.Update))
           {
                  // update succeeded
           }
           else
           { 

            // update failed, check evt.Errors
            }
      } 

ADO.NET是否比较了rowversions?是在看@@ rowcount吗?

0 个答案:

没有答案