我不明白 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 方法。
确实应该存在并发错误,因为我故意更改数据库行以强制执行新的行版本。但是 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 是否比较行版本?它在看@@rowcount 吗?