2017-08-10 50 views
0

我有多個API客戶端調用TokenAuth/Authenticate來獲取使用該API的accesstoken。當他們嘗試這個過於靠近彼此時,TokenAuthController/Autheticate中的GetLoginResultAsync會發生併發衝突。多個API客戶端在auth上發生併發衝突

完全異常消息:數據庫操作預計會影響1行,但實際上影響0行。自實體加載後,數據可能已被修改或刪除。有關理解和處理樂觀併發異常的信息,請參閱http://go.microsoft.com/fwlink/?LinkId=527962

爲什麼,我該如何解決這個問題?

回答

1

(我猜你的不同客戶使用相同的帳戶登錄。)

一般例外解釋;一個實體從數據庫中獲取,然後另一個客戶端獲取相同的實體。第二個客戶端更新了實體並提交給數據庫。當第一個客戶端嘗試保存實體時,他有一個過時的髒實體。因此你得到了併發衝突!

這發生在使用Optimistic Locking時。並且AspnetBoilerplate使用該方法的性能優先級爲Pessimistic Locking

解決方案: 在您的TokenAuthController類中修改Authenticate方法;

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 ... 
    } 
} 

對於AsyncLock圖書館看到https://github.com/StephenCleary/AsyncEx