我不明白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吗?