Don't miss out Virtual Happy Hour this Friday (April 26).

Try our conversational search powered by Generative AI!

Race condition in BusinessFoundationInitializeModule causing 500 errors

Fixed in

EPiServer.Commerce 12.17.0

(Or a related package)

Created

Jan 09, 2019

Updated

Feb 15, 2019

State

Closed, Fixed and tested


Description

Steps to reproduce:
1. Install QuickSilver.
2. Create a user by signing up. When the user logs in, a CustomerContact is created.
3. Delete the customer contact and related address from Commerce for this user, but not the user in asp.net identity.
4. Send 2 requests to http://localhost:50244/en/my-pages/profile/ at the same time.

Expected:
A 200 status code should be returned.

Actual:
A 500 status code is returned for 1 request.

Violation of UNIQUE KEY constraint 'UQ__cls_Cont__1788CC4D5F628676'. Cannot insert duplicate key in object 'dbo.cls_Contact'. The duplicate key value is (String:test1@example.com).
The statement has been terminated. 
[SqlException (0x80131904): Violation of UNIQUE KEY constraint 'UQ__cls_Cont__1788CC4D5F628676'. Cannot insert duplicate key in object 'dbo.cls_Contact'. The duplicate key value is (String:test1@example.com).
The statement has been terminated.]
System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +2551578
   System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +5951128
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +285
   System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +4169
   System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption, Boolean shouldCacheForAlwaysEncrypted) +255
   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest) +2598
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry) +1483
   System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry) +374
   System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +286
   Mediachase.BusinessFoundation.Data.Sql.<>c__DisplayClass32_0.<ExecuteNonQuery>b__0() +13
   EPiServer.Data.Providers.SqlTransientErrorsRetryPolicy.Execute(Func`1 method) +563
   Mediachase.BusinessFoundation.Data.Sql.SqlHelper.WithRetry(Func`1 action) +44
   Mediachase.BusinessFoundation.Data.Sql.SqlHelper.ExecuteNonQuery(SqlConnection connection, SqlTransaction transaction, CommandType commandType, String commandText, Int32 commandTimeOut, SqlParameter[] commandParameters) +193
   Mediachase.BusinessFoundation.Data.Sql.SqlHelper.ExecuteNonQuery(SqlContext context, CommandType commandType, String commandText, SqlParameter[] commandParameters) +62
   Mediachase.BusinessFoundation.Data.DataHelper.Insert(TableConfig config, Dictionary`2 values) +567
   Mediachase.BusinessFoundation.Data.Sql.CustomTableRow.Update() +120
   Mediachase.BusinessFoundation.Data.Meta.MetaObject.SaveObject(Boolean bForceSave) +360
   Mediachase.BusinessFoundation.Data.Meta.MetaObject.Save(Boolean forceSave) +70
   Mediachase.BusinessFoundation.Data.Business.EntityObjectDefaultRequestHandler.Create(BusinessContext context) +405
   Mediachase.BusinessFoundation.Data.Business.EntityObjectDefaultRequestHandler.Execute(BusinessContext context) +353
   Mediachase.BusinessFoundation.Data.Business.BaseRequestHandler.Mediachase.BusinessFoundation.Data.Business.IRequestHandler.Execute(BusinessContext context) +10
   Mediachase.BusinessFoundation.Data.Business.BusinessManager.ExecutePipeline(IRequestHandler handler) +45
   Mediachase.BusinessFoundation.Data.Business.BusinessManager.ExecutePipelineInTransaction(IRequestHandler handler) +50
   Mediachase.BusinessFoundation.Data.Business.BusinessManager.Execute(Request request) +168
   Mediachase.BusinessFoundation.Data.Business.BusinessManager.Create(EntityObject target) +42
   Mediachase.Commerce.Customers.CustomerContact.SaveChanges() +346
   Mediachase.Commerce.Security.PrincipalExtensions.GetCustomerContact(IPrincipal principal) +168
   Mediachase.Commerce.Security.PrincipalExtensions.GetContactId(IPrincipal principal) +109
   Mediachase.Commerce.Core.Modules.BusinessFoundationInitializeModule.context_AuthorizeRequest(Object sender, EventArgs e) +40
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +141
   System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step) +48
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +71