(私はあなたの異なるクライアントがログインするには、同じアカウントを使用すると思います。)一般的に
例外が説明。エンティティはデータベースからフェッチされ、その後、別のクライアントが同じエンティティをフェッチします。 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
を見ます