2017-08-10 8 views
0

私は、APIを使用するためのアクセス権を取得するためにTokenAuth/Authenticateを呼び出す複数のAPIクライアントを持っています。これを互いに近づけすぎると、TokenAuthController/AutheticateのGetLoginResultAsyncで並行処理の競合が発生します。複数のAPIクライアントが認証時に同時実行競合を発生する

完全な例外メッセージ:データベース操作は1行に影響すると予想されますが、実際には0行に影響します。エンティティがロードされてからデータが変更または削除された可能性があります。オプティミスティックな同時実行例外の理解と処理については、http://go.microsoft.com/fwlink/?LinkId=527962を参照してください。

なぜ、どのように解決すればよいですか?

答えて

1

(私はあなたの異なるクライアントがログインするには、同じアカウントを使用すると思います。)一般的に

例外が説明。エンティティはデータベースからフェッチされ、その後、別のクライアントが同じエンティティをフェッチします。 2番目のクライアントはエンティティを更新し、データベースにコミットしました。最初のクライアントがエンティティを保存しようとしている間、彼は古くなった汚れたエンティティを持っています。したがって、同時実行性の競合が発生しました。

これは、Optimistic Lockingを使用した場合に発生します。そして、AspnetBoilerplateはパフォーマンス優先度のためにそのメソッドをPessimistic Lockingに対して使います。

ソリューション: TokenAuthControllerクラスで、Authenticateメソッドを変更します。 AsyncLockライブラリの

private readonly AsyncLock _asyncLock = new AsyncLock(); 

[HttpPost] 
public async Task<AuthenticateResultModel> Authenticate([FromBody] AuthenticateModel model) 
{ 
    //i am using AsyncLock because there are async methods in Authenticate. 
    using (await _asyncLock.LockAsync()) 
    { 
     var loginResult = await GetLoginResultAsync(
      model.UserNameOrEmailAddress, 
      model.Password, 
      GetTenancyNameOrNull() 
     ); 

     //other codes ... 
    } 
} 

https://github.com/StephenCleary/AsyncEx

を見ます
関連する問題