Open Closed

AbpDbConcurrencyException #9604


User avatar
0
jaylin created

Hi there,

I got hundreds of this exception when we got users login / register simultaneously. Database was not that busy at that time. BTW: I don't have plan to upgrade the 8.2.2 to v9 yet.

I don't remember I have any notification services that hook with HandleNonSuccessAndDebuggerNotification

SourceContext Volo.Abp.OpenIddict.AbpOpenIddictStoreBase RequestPath /connect/token UserId 862dde9c-647d-3df2-e65d-3a16b6aecc53 ActionName Volo.Abp.OpenIddict.Controllers.TokenController.HandleAsync (Volo.Abp.OpenIddict.AspNetCore)

  • Exception message and full stack trace: Volo.Abp.Data.AbpDbConcurrencyException: at Volo.Abp.EntityFrameworkCore.AbpDbContext1+<SaveChangesAsync>d__48.MoveNext (Volo.Abp.EntityFrameworkCore, Version=8.2.2.0, Culture=neutral, PublicKeyToken=null) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at Volo.Abp.Domain.Repositories.EntityFrameworkCore.EfCoreRepository2+<UpdateAsync>d__24.MoveNext (Volo.Abp.EntityFrameworkCore, Version=8.2.2.0, Culture=neutral, PublicKeyToken=null) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at Castle.DynamicProxy.AsyncInterceptorBase+<ProceedAsynchronous>d__141.MoveNext (Castle.Core.AsyncInterceptor, Version=2.1.0.0, Culture=neutral, PublicKeyToken=e33b67d3bb5581e4) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue1+<ProceedAsync>d__7.MoveNext (Volo.Abp.Castle.Core, Version=8.2.2.0, Culture=neutral, PublicKeyToken=null) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at Volo.Abp.Uow.UnitOfWorkInterceptor+<InterceptAsync>d__2.MoveNext (Volo.Abp.Uow, Version=8.2.2.0, Culture=neutral, PublicKeyToken=null) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter1+<InterceptAsync>d__31.MoveNext (Volo.Abp.Castle.Core, Version=8.2.2.0, Culture=neutral, PublicKeyToken=null) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at Volo.Abp.OpenIddict.Tokens.AbpOpenIddictTokenStore+<UpdateAsync>d__48.MoveNext (Volo.Abp.OpenIddict.Domain, Version=8.2.2.0, Culture=neutral, PublicKeyToken=null) Inner exception Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException handled at Volo.Abp.EntityFrameworkCore.AbpDbContext1+<SaveChangesAsync>d__48.MoveNext: at Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch+<ThrowAggregateUpdateConcurrencyExceptionAsync>d__10.MoveNext (Microsoft.EntityFrameworkCore.Relational, Version=8.0.4.0, Culture=neutral, PublicKeyToken=adb9793829ddae60) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch+<ConsumeResultSetWithRowsAffectedOnlyAsync>d__6.MoveNext (Microsoft.EntityFrameworkCore.Relational, Version=8.0.4.0, Culture=neutral, PublicKeyToken=adb9793829ddae60) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch+<ConsumeAsync>d__2.MoveNext (Microsoft.EntityFrameworkCore.Relational, Version=8.0.4.0, Culture=neutral, PublicKeyToken=adb9793829ddae60) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch+<ExecuteAsync>d__50.MoveNext (Microsoft.EntityFrameworkCore.Relational, Version=8.0.4.0, Culture=neutral, PublicKeyToken=adb9793829ddae60) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch+<ExecuteAsync>d__50.MoveNext (Microsoft.EntityFrameworkCore.Relational, Version=8.0.4.0, Culture=neutral, PublicKeyToken=adb9793829ddae60) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at Microsoft.EntityFrameworkCore.SqlServer.Update.Internal.SqlServerModificationCommandBatch+<ExecuteAsync>d__15.MoveNext (Microsoft.EntityFrameworkCore.SqlServer, Version=8.0.4.0, Culture=neutral, PublicKeyToken=adb9793829ddae60) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor+<ExecuteAsync>d__9.MoveNext (Microsoft.EntityFrameworkCore.Relational, Version=8.0.4.0, Culture=neutral, PublicKeyToken=adb9793829ddae60) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor+<ExecuteAsync>d__9.MoveNext (Microsoft.EntityFrameworkCore.Relational, Version=8.0.4.0, Culture=neutral, PublicKeyToken=adb9793829ddae60) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor+<ExecuteAsync>d__9.MoveNext (Microsoft.EntityFrameworkCore.Relational, Version=8.0.4.0, Culture=neutral, PublicKeyToken=adb9793829ddae60) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager+<SaveChangesAsync>d__111.MoveNext (Microsoft.EntityFrameworkCore, Version=8.0.4.0, Culture=neutral, PublicKeyToken=adb9793829ddae60) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager+<SaveChangesAsync>d__115.MoveNext (Microsoft.EntityFrameworkCore, Version=8.0.4.0, Culture=neutral, PublicKeyToken=adb9793829ddae60) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy+<ExecuteAsync>d__72.MoveNext (Microsoft.EntityFrameworkCore.SqlServer, Version=8.0.4.0, Culture=neutral, PublicKeyToken=adb9793829ddae60) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at Microsoft.EntityFrameworkCore.DbContext+<SaveChangesAsync>d__63.MoveNext (Microsoft.EntityFrameworkCore, Version=8.0.4.0, Culture=neutral, PublicKeyToken=adb9793829ddae60) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at Volo.Abp.EntityFrameworkCore.AbpDbContext`1+

4 Answer(s)
  • User Avatar
    0
    AI-Bot created
    Support Team ABP Agent

    When you encounter a large number of AbpDbConcurrencyException errors during simultaneous user login or registration, it typically indicates that multiple processes are trying to update the same database record at the same time. In ABP Framework, this is managed using Optimistic Concurrency Control, which relies on a concurrency token (like ConcurrencyStamp) to detect conflicting updates.

    Why This Happens

    • The OpenIddict token endpoint (/connect/token) updates token or user records as part of the authentication flow.
    • If many users log in or register at the same time, concurrent updates to the same user or token records can cause concurrency conflicts.
    • ABP and EF Core throw AbpDbConcurrencyException (wrapping DbUpdateConcurrencyException) when the concurrency token in the database does not match the one in the entity being updated.

    How to Mitigate

    1. Understand the Concurrency Model
      ABP uses Optimistic Concurrency Control. When an update occurs, the ConcurrencyStamp is checked. If it has changed since the entity was loaded, a concurrency exception is thrown.
      See:

    2. Reduce Simultaneous Updates

      • Avoid updating the same user or token record in multiple parallel requests.
      • For login/registration, ensure that your client does not retry or send multiple requests for the same user at the same time.
    3. Handle Concurrency Exceptions Gracefully

      • Catch AbpDbConcurrencyException in your application layer and provide a user-friendly message or retry logic if appropriate.
      • For background or batch operations, consider implementing a retry policy with a backoff.
    4. Database and Index Tuning

      • Ensure your database is not under heavy lock contention.
      • Make sure indexes are properly set up for the tables involved in authentication and token management.
    5. Review Customizations

      • If you have custom logic in user or token update flows, ensure you are not causing unnecessary updates or holding entities longer than needed.
    6. Upgrade Considerations

      • While you mentioned not planning to upgrade to v9 yet, note that newer versions may include improvements or bug fixes related to concurrency handling.

    Example: Handling Concurrency in ABP

    try
    {
        // Your update logic here
    }
    catch (AbpDbConcurrencyException ex)
    {
        // Handle the concurrency conflict, e.g., reload entity and retry or inform the user
    }
    

    Additional Notes

    • This is not related to notification services or HandleNonSuccessAndDebuggerNotification directly; it's a result of how EF Core and ABP handle concurrent updates.
    • If you have a high-traffic authentication system, consider scaling out your authentication server and reviewing your token/user update logic.

    Sources:


    This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.

  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    hi

    Can you try to add MyAbpEfCoreNavigationHelper to your Auth(EF Core) website?

    https://abp.io/support/questions/8933/Intermittent-Login-Failure-After-Upgrading-ABP-Framework-to-v9#answer-3a189b11-6314-b51d-08de-b775c7bdf450

  • User Avatar
    0
    jaylin created

    Let me try, I saw this thread, but I was not sure if it can be applied to v8.2.2.

  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    It will be fixed after 9.1.1

    Thanks.

Boost Your Development
ABP Live Training
Packages
See Trainings
Mastering ABP Framework Book
The Official Guide
Mastering
ABP Framework
Learn More
Mastering ABP Framework Book
Made with ❤️ on ABP v10.0.0-preview. Updated on September 05, 2025, 09:28