ADO.NETが「ブラックボックス」内で、私が指示している以上のことを実行していない限り、同時実行違反をどのように認識するのかわかりません。
SQL Server 2000での更新クエリは、次の例のように簡略化されています。クライアントによってストアドプロシージャに渡されたrowversionがデータベースのrowversionと一致しない場合、where-clauseは失敗し、行は更新されません。
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を見ていますか?