Intermittently I see that CreateAsync method throws the following SqlException while creating Umbraco members. Has anybody seen this before and hopefully fixed it please? This looks like an Umbraco bug which hasn't been reported, yet.
DB Logs:
System.Data.SqlClient.SqlException (0x80131904): New transaction is not allowed because there are other threads running in the session.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action
1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel, Int32 timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, Boolean isDelegateControlRequest) at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest transactionRequest, String transactionName, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest) at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransaction(TransactionRequest transactionRequest, String name, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest) at System.Data.SqlClient.SqlInternalConnection.BeginSqlTransaction(IsolationLevel iso, String transactionName, Boolean shouldReconnect) at System.Data.SqlClient.SqlConnection.BeginTransaction(IsolationLevel iso, String transactionName) at System.Data.SqlClient.SqlC
Details:
Umbraco version 7.5.7 assembly: 1.0.6219.11990
Method that throws the exception intermittently:
private static async Task<UmbracoApplicationMember> CreateMember(UmbracoMembersUserManager<UmbracoApplicationMember> uMgr, string loginName, string properName, UserLoginInfo loginInfo)
{
var user = new UmbracoApplicationMember
{
Name = properName,
UserName = loginName,
Email = loginName
};
var result = await uMgr.CreateAsync(user); // This is where the exception is thrown intermittently
// The rest of the code...
Further Details:
CreateAsync:
Assembly Microsoft.AspNet.Identity.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
//
// Summary:
// Create a user with no password
//
// Parameters:
// user:
[AsyncStateMachine(typeof(UserManager<,>.<CreateAsync>d__0))]
[DebuggerStepThrough]
public virtual Task<IdentityResult> CreateAsync(TUser user);
UmbracoIdentity:
#region Assembly UmbracoIdentity, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
// D:\tfs\MYPROJECT\DEV\WEB\MYPROJECT.Web\packages\UmbracoIdentity.Core.5.0.0\lib\net45\UmbracoIdentity.dll
#endregion
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using Umbraco.Core.Logging;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.SqlSyntax;
using Umbraco.Core.Services;
using UmbracoIdentity.Models;
namespace UmbracoIdentity
{
public class UmbracoMembersUserManager<TUser> : UserManager<TUser, int> where TUser : UmbracoIdentityMember, IUser<int>, new()
{
public UmbracoMembersUserManager(IUserStore<TUser, int> store);
public override bool SupportsQueryableUsers { get; }
public override bool SupportsUserLockout { get; }
public override bool SupportsUserSecurityStamp { get; }
public override bool SupportsUserTwoFactor { get; }
public override bool SupportsUserPhoneNumber { get; }
public static UmbracoMembersUserManager<TUser> Create(IdentityFactoryOptions<UmbracoMembersUserManager<TUser>> options, ILogger logger, ISqlSyntaxProvider sqlSyntax, UmbracoDatabase database, IMemberService memberService, IMemberTypeService memberTypeService, IMemberGroupService memberGroupService, IdentityEnabledMembersMembershipProvider membershipProvider = null);
public static UmbracoMembersUserManager<TUser> Create(IdentityFactoryOptions<UmbracoMembersUserManager<TUser>> options, IMemberService memberService, IMemberTypeService memberTypeService, IMemberGroupService memberGroupService, IExternalLoginStore externalLoginStore = null, IdentityEnabledMembersMembershipProvider membershipProvider = null);
public static UmbracoMembersUserManager<TUser> Create(IdentityFactoryOptions<UmbracoMembersUserManager<TUser>> options, UmbracoMembersUserStore<TUser> customUserStore, IdentityEnabledMembersMembershipProvider membershipProvider = null);
protected override void Dispose(bool disposing);
}
}
UmbracoApplicationMember:
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNet.Identity;
using UmbracoIdentity;
using UmbracoIdentity.Models;
namespace MYPROJECT.Web.Presentation.Models.UmbracoIdentity
{
public class UmbracoApplicationMember : UmbracoIdentityMember
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<UmbracoApplicationMember, int> manager)
{
// Note the authenticationType must match the one
// defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
}
}
User contributions licensed under CC BY-SA 3.0