From bc45dd8d6abd69948e83aa8a378a96238dae5977 Mon Sep 17 00:00:00 2001 From: Stephan Date: Mon, 30 May 2016 19:47:49 +0200 Subject: [PATCH] U4-8536 - removing db.GetTransaction wherever possible --- .../Persistence/NPocoDatabaseExtensions.cs | 58 +++---- .../Repositories/ContentRepository.cs | 16 +- .../Repositories/ExternalLoginRepository.cs | 34 ++-- .../Repositories/MemberGroupRepository.cs | 102 +++++------ .../Repositories/NotificationsRepository.cs | 10 +- .../Repositories/PermissionRepository.cs | 158 ++++++++---------- .../Repositories/RepositoryBase.cs | 3 +- .../Persistence/Repositories/TagRepository.cs | 99 +++++------ .../Repositories/VersionableRepositoryBase.cs | 16 +- .../Services/ExternalLoginService.cs | 2 + .../Services/NotificationService.cs | 1 + src/Umbraco.Core/Services/UserService.cs | 2 + .../Persistence/NPocoExtensionsTest.cs | 2 +- .../Services/PerformanceTests.cs | 8 +- .../PublishedCache/NuCache/FacadeService.cs | 9 +- .../XmlPublishedCache/XmlStore.cs | 8 +- 16 files changed, 218 insertions(+), 310 deletions(-) diff --git a/src/Umbraco.Core/Persistence/NPocoDatabaseExtensions.cs b/src/Umbraco.Core/Persistence/NPocoDatabaseExtensions.cs index 140ef071e6..fb7201657f 100644 --- a/src/Umbraco.Core/Persistence/NPocoDatabaseExtensions.cs +++ b/src/Umbraco.Core/Persistence/NPocoDatabaseExtensions.cs @@ -163,15 +163,17 @@ namespace Umbraco.Core.Persistence // fixme - NPoco has BulkInsert now? - public static void BulkInsertRecords(this IDatabase db, ISqlSyntaxProvider sqlSyntax, IEnumerable collection) + public static void BulkInsertRecordsWithTransaction(this IDatabase db, ISqlSyntaxProvider sqlSyntax, IEnumerable collection) { //don't do anything if there are no records. if (collection.Any() == false) return; + // no need to "try...catch", if the transaction is not completed it will rollback! using (var tr = db.GetTransaction()) { - db.BulkInsertRecords(sqlSyntax, collection, tr, true); + db.BulkInsertRecords(sqlSyntax, collection); + tr.Complete(); } } @@ -183,54 +185,36 @@ namespace Umbraco.Core.Persistence /// /// /// - /// - /// - public static void BulkInsertRecords(this IDatabase db, ISqlSyntaxProvider sqlSyntax, IEnumerable collection, ITransaction tr, bool commitTrans = false) + public static void BulkInsertRecords(this IDatabase db, ISqlSyntaxProvider sqlSyntax, IEnumerable collection) { //don't do anything if there are no records. if (collection.Any() == false) return; - try + //if it is sql ce or it is a sql server version less than 2008, we need to do individual inserts. + var sqlServerSyntax = sqlSyntax as SqlServerSyntaxProvider; + if ((sqlServerSyntax != null && (int) sqlServerSyntax.ServerVersion.ProductVersionName < (int) SqlServerSyntaxProvider.VersionName.V2008) + || sqlSyntax is SqlCeSyntaxProvider) { - //if it is sql ce or it is a sql server version less than 2008, we need to do individual inserts. - var sqlServerSyntax = sqlSyntax as SqlServerSyntaxProvider; - if ((sqlServerSyntax != null && (int) sqlServerSyntax.ServerVersion.ProductVersionName < (int) SqlServerSyntaxProvider.VersionName.V2008) - || sqlSyntax is SqlCeSyntaxProvider) - { - //SqlCe doesn't support bulk insert statements! + //SqlCe doesn't support bulk insert statements! - foreach (var poco in collection) - { - db.Insert(poco); - } - } - else + foreach (var poco in collection) { - string[] sqlStatements; - var cmds = db.GenerateBulkInsertCommand(collection, db.Connection, out sqlStatements); - for (var i = 0; i < sqlStatements.Length; i++) - { - using (var cmd = cmds[i]) - { - cmd.CommandText = sqlStatements[i]; - cmd.ExecuteNonQuery(); - } - } - } - - if (commitTrans) - { - tr.Complete(); + db.Insert(poco); } } - catch + else { - if (commitTrans) + string[] sqlStatements; + var cmds = db.GenerateBulkInsertCommand(collection, db.Connection, out sqlStatements); + for (var i = 0; i < sqlStatements.Length; i++) { - tr.Dispose(); + using (var cmd = cmds[i]) + { + cmd.CommandText = sqlStatements[i]; + cmd.ExecuteNonQuery(); + } } - throw; } } diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs index 7a4fab20f1..6bc822ccd6 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs @@ -199,12 +199,7 @@ namespace Umbraco.Core.Persistence.Repositories if (dto == null) return; - using (var transaction = Database.GetTransaction()) - { - PerformDeleteVersion(dto.NodeId, versionId); - - transaction.Complete(); - } + PerformDeleteVersion(dto.NodeId, versionId); } public override void DeleteVersions(int id, DateTime versionDate) @@ -219,14 +214,9 @@ namespace Umbraco.Core.Persistence.Repositories var list = Database.Fetch(sql); if (list.Any() == false) return; - using (var transaction = Database.GetTransaction()) + foreach (var dto in list) { - foreach (var dto in list) - { - PerformDeleteVersion(id, dto.VersionId); - } - - transaction.Complete(); + PerformDeleteVersion(id, dto.VersionId); } } diff --git a/src/Umbraco.Core/Persistence/Repositories/ExternalLoginRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ExternalLoginRepository.cs index 40af744ae8..5868216062 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ExternalLoginRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ExternalLoginRepository.cs @@ -25,34 +25,24 @@ namespace Umbraco.Core.Persistence.Repositories public void DeleteUserLogins(int memberId) { - using (var t = Database.GetTransaction()) - { - Database.Execute("DELETE FROM ExternalLogins WHERE UserId=@userId", new { userId = memberId }); - - t.Complete(); - } + Database.Execute("DELETE FROM ExternalLogins WHERE UserId=@userId", new { userId = memberId }); } public void SaveUserLogins(int memberId, IEnumerable logins) { - using (var t = Database.GetTransaction()) + //clear out logins for member + Database.Execute("DELETE FROM umbracoExternalLogin WHERE userId=@userId", new { userId = memberId }); + + //add them all + foreach (var l in logins) { - //clear out logins for member - Database.Execute("DELETE FROM umbracoExternalLogin WHERE userId=@userId", new { userId = memberId }); - - //add them all - foreach (var l in logins) + Database.Insert(new ExternalLoginDto { - Database.Insert(new ExternalLoginDto - { - LoginProvider = l.LoginProvider, - ProviderKey = l.ProviderKey, - UserId = memberId, - CreateDate = DateTime.Now - }); - } - - t.Complete(); + LoginProvider = l.LoginProvider, + ProviderKey = l.ProviderKey, + UserId = memberId, + CreateDate = DateTime.Now + }); } } diff --git a/src/Umbraco.Core/Persistence/Repositories/MemberGroupRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MemberGroupRepository.cs index 835fe0ab8a..c636bf19bf 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MemberGroupRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MemberGroupRepository.cs @@ -145,30 +145,26 @@ namespace Umbraco.Core.Persistence.Repositories public IMemberGroup CreateIfNotExists(string roleName) { - using (var transaction = Database.GetTransaction()) + var qry = QueryFactory.Create().Where(group => group.Name.Equals(roleName)); + var result = GetByQuery(qry); + + if (result.Any()) return null; + + var grp = new MemberGroup { - var qry = QueryFactory.Create().Where(group => group.Name.Equals(roleName)); - var result = GetByQuery(qry); + Name = roleName + }; + PersistNewItem(grp); - if (result.Any()) return null; - - var grp = new MemberGroup - { - Name = roleName - }; - PersistNewItem(grp); - - if (SavingMemberGroup.IsRaisedEventCancelled(new SaveEventArgs(grp), this)) - { - return null; - } - - transaction.Complete(); - - SavedMemberGroup.RaiseEvent(new SaveEventArgs(grp), this); - - return grp; + if (SavingMemberGroup.IsRaisedEventCancelled(new SaveEventArgs(grp), this)) + { + return null; } + + // fixme - in a repository?! + SavedMemberGroup.RaiseEvent(new SaveEventArgs(grp), this); + + return grp; } public IEnumerable GetMemberGroupsForMember(int memberId) @@ -219,53 +215,41 @@ namespace Umbraco.Core.Persistence.Repositories public void AssignRoles(string[] usernames, string[] roleNames) { - using (var transaction = Database.GetTransaction()) - { - //first get the member ids based on the usernames - var memberObjectType = new Guid(Constants.ObjectTypes.Member); + //first get the member ids based on the usernames + var memberObjectType = new Guid(Constants.ObjectTypes.Member); - var memberSql = Sql() - .Select("umbracoNode.id") - .From() - .InnerJoin() - .On(dto => dto.NodeId, dto => dto.NodeId) - .Where(x => x.NodeObjectType == memberObjectType) - .Where("cmsMember.LoginName in (@usernames)", new { /*usernames =*/ usernames }); - var memberIds = Database.Fetch(memberSql).ToArray(); + var memberSql = Sql() + .Select("umbracoNode.id") + .From() + .InnerJoin() + .On(dto => dto.NodeId, dto => dto.NodeId) + .Where(x => x.NodeObjectType == memberObjectType) + .Where("cmsMember.LoginName in (@usernames)", new { /*usernames =*/ usernames }); + var memberIds = Database.Fetch(memberSql).ToArray(); - AssignRolesInternal(memberIds, roleNames); - transaction.Complete(); - } + AssignRolesInternal(memberIds, roleNames); } public void DissociateRoles(string[] usernames, string[] roleNames) { - using (var transaction = Database.GetTransaction()) - { - //first get the member ids based on the usernames - var memberObjectType = new Guid(Constants.ObjectTypes.Member); + //first get the member ids based on the usernames + var memberObjectType = new Guid(Constants.ObjectTypes.Member); - var memberSql = Sql() - .Select("umbracoNode.id") - .From() - .InnerJoin() - .On(dto => dto.NodeId, dto => dto.NodeId) - .Where( x => x.NodeObjectType == memberObjectType) - .Where("cmsMember.LoginName in (@usernames)", new { /*usernames =*/ usernames }); - var memberIds = Database.Fetch(memberSql).ToArray(); + var memberSql = Sql() + .Select("umbracoNode.id") + .From() + .InnerJoin() + .On(dto => dto.NodeId, dto => dto.NodeId) + .Where( x => x.NodeObjectType == memberObjectType) + .Where("cmsMember.LoginName in (@usernames)", new { /*usernames =*/ usernames }); + var memberIds = Database.Fetch(memberSql).ToArray(); - DissociateRolesInternal(memberIds, roleNames); - transaction.Complete(); - } + DissociateRolesInternal(memberIds, roleNames); } public void AssignRoles(int[] memberIds, string[] roleNames) { - using (var transaction = Database.GetTransaction()) - { - AssignRolesInternal(memberIds, roleNames); - transaction.Complete(); - } + AssignRolesInternal(memberIds, roleNames); } public void AssignRolesInternal(int[] memberIds, string[] roleNames) @@ -333,11 +317,7 @@ namespace Umbraco.Core.Persistence.Repositories public void DissociateRoles(int[] memberIds, string[] roleNames) { - using (var transaction = Database.GetTransaction()) - { - DissociateRolesInternal(memberIds, roleNames); - transaction.Complete(); - } + DissociateRolesInternal(memberIds, roleNames); } private void DissociateRolesInternal(int[] memberIds, string[] roleNames) diff --git a/src/Umbraco.Core/Persistence/Repositories/NotificationsRepository.cs b/src/Umbraco.Core/Persistence/Repositories/NotificationsRepository.cs index 106d1bfcd6..936e43839b 100644 --- a/src/Umbraco.Core/Persistence/Repositories/NotificationsRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/NotificationsRepository.cs @@ -37,14 +37,8 @@ namespace Umbraco.Core.Persistence.Repositories public IEnumerable SetNotifications(IUser user, IEntity entity, string[] actions) { - var notifications = new List(); - using (var t = _unitOfWork.Database.GetTransaction()) - { - DeleteNotifications(user, entity); - notifications.AddRange(actions.Select(action => CreateNotification(user, entity, action))); - t.Complete(); - } - return notifications; + DeleteNotifications(user, entity); + return actions.Select(action => CreateNotification(user, entity, action)).ToList(); } public IEnumerable GetEntityNotifications(IEntity entity) diff --git a/src/Umbraco.Core/Persistence/Repositories/PermissionRepository.cs b/src/Umbraco.Core/Persistence/Repositories/PermissionRepository.cs index 9a8eb6fa04..9ddc32f21c 100644 --- a/src/Umbraco.Core/Persistence/Repositories/PermissionRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/PermissionRepository.cs @@ -128,37 +128,34 @@ namespace Umbraco.Core.Persistence.Repositories public void ReplaceUserPermissions(int userId, IEnumerable permissions, params int[] entityIds) { var db = _unitOfWork.Database; - using (var trans = db.GetTransaction()) + + //we need to batch these in groups of 2000 so we don't exceed the max 2100 limit + foreach (var idGroup in entityIds.InGroupsOf(2000)) { - //we need to batch these in groups of 2000 so we don't exceed the max 2100 limit - foreach (var idGroup in entityIds.InGroupsOf(2000)) - { - db.Execute("DELETE FROM umbracoUser2NodePermission WHERE userId=@userId AND nodeId in (@nodeIds)", - new { userId = userId, nodeIds = idGroup }); - } - - var toInsert = new List(); - foreach (var p in permissions) - { - foreach (var e in entityIds) - { - toInsert.Add(new User2NodePermissionDto - { - NodeId = e, - Permission = p.ToString(CultureInfo.InvariantCulture), - UserId = userId - }); - } - } - - _unitOfWork.Database.BulkInsertRecords(SqlSyntax, toInsert, trans); - - trans.Complete(); - - //Raise the event - AssignedPermissions.RaiseEvent( - new SaveEventArgs(ConvertToPermissionList(toInsert), false), this); + db.Execute("DELETE FROM umbracoUser2NodePermission WHERE userId=@userId AND nodeId in (@nodeIds)", + new { userId = userId, nodeIds = idGroup }); } + + var toInsert = new List(); + foreach (var p in permissions) + { + foreach (var e in entityIds) + { + toInsert.Add(new User2NodePermissionDto + { + NodeId = e, + Permission = p.ToString(CultureInfo.InvariantCulture), + UserId = userId + }); + } + } + + _unitOfWork.Database.BulkInsertRecords(SqlSyntax, toInsert); + + //Raise the event + // fixme - in the repository? + AssignedPermissions.RaiseEvent( + new SaveEventArgs(ConvertToPermissionList(toInsert), false), this); } /// @@ -170,31 +167,28 @@ namespace Umbraco.Core.Persistence.Repositories public void AssignUserPermission(int userId, char permission, params int[] entityIds) { var db = _unitOfWork.Database; - using (var trans = db.GetTransaction()) - { - db.Execute("DELETE FROM umbracoUser2NodePermission WHERE userId=@userId AND permission=@permission AND nodeId in (@entityIds)", - new - { - userId = userId, - permission = permission.ToString(CultureInfo.InvariantCulture), - entityIds = entityIds - }); - var actions = entityIds.Select(id => new User2NodePermissionDto + db.Execute("DELETE FROM umbracoUser2NodePermission WHERE userId=@userId AND permission=@permission AND nodeId in (@entityIds)", + new { - NodeId = id, - Permission = permission.ToString(CultureInfo.InvariantCulture), - UserId = userId - }).ToArray(); + userId = userId, + permission = permission.ToString(CultureInfo.InvariantCulture), + entityIds = entityIds + }); - _unitOfWork.Database.BulkInsertRecords(SqlSyntax, actions, trans); + var actions = entityIds.Select(id => new User2NodePermissionDto + { + NodeId = id, + Permission = permission.ToString(CultureInfo.InvariantCulture), + UserId = userId + }).ToArray(); - trans.Complete(); + _unitOfWork.Database.BulkInsertRecords(SqlSyntax, actions); - //Raise the event - AssignedPermissions.RaiseEvent( - new SaveEventArgs(ConvertToPermissionList(actions), false), this); - } + //Raise the event + // fixme - in the repo? + AssignedPermissions.RaiseEvent( + new SaveEventArgs(ConvertToPermissionList(actions), false), this); } /// @@ -206,31 +200,28 @@ namespace Umbraco.Core.Persistence.Repositories public void AssignEntityPermission(TEntity entity, char permission, IEnumerable userIds) { var db = _unitOfWork.Database; - using (var trans = db.GetTransaction()) - { - db.Execute("DELETE FROM umbracoUser2NodePermission WHERE nodeId=@nodeId AND permission=@permission AND userId in (@userIds)", - new - { - nodeId = entity.Id, - permission = permission.ToString(CultureInfo.InvariantCulture), - userIds = userIds - }); - var actions = userIds.Select(id => new User2NodePermissionDto + db.Execute("DELETE FROM umbracoUser2NodePermission WHERE nodeId=@nodeId AND permission=@permission AND userId in (@userIds)", + new { - NodeId = entity.Id, - Permission = permission.ToString(CultureInfo.InvariantCulture), - UserId = id - }).ToArray(); + nodeId = entity.Id, + permission = permission.ToString(CultureInfo.InvariantCulture), + userIds = userIds + }); - _unitOfWork.Database.BulkInsertRecords(SqlSyntax, actions, trans); + var actions = userIds.Select(id => new User2NodePermissionDto + { + NodeId = entity.Id, + Permission = permission.ToString(CultureInfo.InvariantCulture), + UserId = id + }).ToArray(); - trans.Complete(); + _unitOfWork.Database.BulkInsertRecords(SqlSyntax, actions); - //Raise the event - AssignedPermissions.RaiseEvent( - new SaveEventArgs(ConvertToPermissionList(actions), false), this); - } + //Raise the event + // fixme - in the repo?! + AssignedPermissions.RaiseEvent( + new SaveEventArgs(ConvertToPermissionList(actions), false), this); } /// @@ -244,25 +235,22 @@ namespace Umbraco.Core.Persistence.Repositories public void ReplaceEntityPermissions(EntityPermissionSet permissionSet) { var db = _unitOfWork.Database; - using (var trans = db.GetTransaction()) + + db.Execute("DELETE FROM umbracoUser2NodePermission WHERE nodeId=@nodeId", new { nodeId = permissionSet.EntityId }); + + var actions = permissionSet.UserPermissionsSet.Select(p => new User2NodePermissionDto { - db.Execute("DELETE FROM umbracoUser2NodePermission WHERE nodeId=@nodeId", new { nodeId = permissionSet.EntityId }); + NodeId = permissionSet.EntityId, + Permission = p.Permission, + UserId = p.UserId + }).ToArray(); - var actions = permissionSet.UserPermissionsSet.Select(p => new User2NodePermissionDto - { - NodeId = permissionSet.EntityId, - Permission = p.Permission, - UserId = p.UserId - }).ToArray(); + _unitOfWork.Database.BulkInsertRecords(SqlSyntax, actions); - _unitOfWork.Database.BulkInsertRecords(SqlSyntax, actions, trans); - - trans.Complete(); - - //Raise the event - AssignedPermissions.RaiseEvent( - new SaveEventArgs(ConvertToPermissionList(actions), false), this); - } + //Raise the event + // fixme - in the repo? + AssignedPermissions.RaiseEvent( + new SaveEventArgs(ConvertToPermissionList(actions), false), this); } private static IEnumerable ConvertToPermissionList(IEnumerable result) diff --git a/src/Umbraco.Core/Persistence/Repositories/RepositoryBase.cs b/src/Umbraco.Core/Persistence/Repositories/RepositoryBase.cs index 23ebdfbba5..be6f986a2e 100644 --- a/src/Umbraco.Core/Persistence/Repositories/RepositoryBase.cs +++ b/src/Umbraco.Core/Persistence/Repositories/RepositoryBase.cs @@ -196,7 +196,7 @@ namespace Umbraco.Core.Persistence.Repositories { return PerformCount(query); } - + /// /// Unit of work method that tells the repository to persist the new entity /// @@ -223,7 +223,6 @@ namespace Umbraco.Core.Persistence.Repositories { CachePolicy.Delete((TEntity) entity, PersistDeletedItem); } - protected abstract void PersistNewItem(TEntity item); protected abstract void PersistUpdatedItem(TEntity item); diff --git a/src/Umbraco.Core/Persistence/Repositories/TagRepository.cs b/src/Umbraco.Core/Persistence/Repositories/TagRepository.cs index 36da4bab17..c9bef38b79 100644 --- a/src/Umbraco.Core/Persistence/Repositories/TagRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/TagRepository.cs @@ -431,62 +431,53 @@ namespace Umbraco.Core.Persistence.Repositories // and assign where they don't exist which we've borrowed here. The queries are pretty zany but work, otherwise we'll end up // with quite a few additional queries. - //do all this in one transaction - using (var trans = Database.GetTransaction()) + var tagSetSql = GetTagSet(asArray); + + //adds any tags found in the collection that aren't in cmsTag + var insertTagsSql = string.Concat("insert into cmsTags (Tag,", + SqlSyntax.GetQuotedColumnName("group"), + ") ", + " select TagSet.Tag, TagSet.", + SqlSyntax.GetQuotedColumnName("group"), + " from ", + tagSetSql, + " left outer join cmsTags on (TagSet.Tag = cmsTags.Tag and TagSet.", + SqlSyntax.GetQuotedColumnName("group"), + " = cmsTags.", + SqlSyntax.GetQuotedColumnName("group"), + ")", + " where cmsTags.Id is null "); + //insert the tags that don't exist + Database.Execute(insertTagsSql); + + if (replaceTags) { - //var factory = new TagFactory(); - - var tagSetSql = GetTagSet(asArray); - - //adds any tags found in the collection that aren't in cmsTag - var insertTagsSql = string.Concat("insert into cmsTags (Tag,", - SqlSyntax.GetQuotedColumnName("group"), - ") ", - " select TagSet.Tag, TagSet.", - SqlSyntax.GetQuotedColumnName("group"), - " from ", - tagSetSql, - " left outer join cmsTags on (TagSet.Tag = cmsTags.Tag and TagSet.", - SqlSyntax.GetQuotedColumnName("group"), - " = cmsTags.", - SqlSyntax.GetQuotedColumnName("group"), - ")", - " where cmsTags.Id is null "); - //insert the tags that don't exist - Database.Execute(insertTagsSql); - - if (replaceTags) - { - //if we are replacing the tags then remove them first - Database.Execute("DELETE FROM cmsTagRelationship WHERE nodeId=" + contentId + " AND propertyTypeId=" + propertyTypeId); - } - - //adds any tags found in csv that aren't in tagrelationships - var insertTagRelationsSql = string.Concat("insert into cmsTagRelationship (tagId,nodeId,propertyTypeId) ", - "select NewTagsSet.Id, " + contentId + ", " + propertyTypeId + " from ", - "( ", - "select NewTags.Id from ", - tagSetSql, - " inner join cmsTags as NewTags on (TagSet.Tag = NewTags.Tag and TagSet.", - SqlSyntax.GetQuotedColumnName("group"), - " = NewTags.", - SqlSyntax.GetQuotedColumnName("group"), - ") ", - ") as NewTagsSet ", - "left outer join cmsTagRelationship ", - "on (cmsTagRelationship.TagId = NewTagsSet.Id and cmsTagRelationship.nodeId = ", - contentId, - " and cmsTagRelationship.propertyTypeId = ", - propertyTypeId, - ") ", - "where cmsTagRelationship.tagId is null "); - - //insert the tags relations that don't exist - Database.Execute(insertTagRelationsSql); - - //GO! - trans.Complete(); + //if we are replacing the tags then remove them first + Database.Execute("DELETE FROM cmsTagRelationship WHERE nodeId=" + contentId + " AND propertyTypeId=" + propertyTypeId); } + + //adds any tags found in csv that aren't in tagrelationships + var insertTagRelationsSql = string.Concat("insert into cmsTagRelationship (tagId,nodeId,propertyTypeId) ", + "select NewTagsSet.Id, " + contentId + ", " + propertyTypeId + " from ", + "( ", + "select NewTags.Id from ", + tagSetSql, + " inner join cmsTags as NewTags on (TagSet.Tag = NewTags.Tag and TagSet.", + SqlSyntax.GetQuotedColumnName("group"), + " = NewTags.", + SqlSyntax.GetQuotedColumnName("group"), + ") ", + ") as NewTagsSet ", + "left outer join cmsTagRelationship ", + "on (cmsTagRelationship.TagId = NewTagsSet.Id and cmsTagRelationship.nodeId = ", + contentId, + " and cmsTagRelationship.propertyTypeId = ", + propertyTypeId, + ") ", + "where cmsTagRelationship.tagId is null "); + + //insert the tags relations that don't exist + Database.Execute(insertTagRelationsSql); } /// diff --git a/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs b/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs index 45a9249d6a..ee7767019f 100644 --- a/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs +++ b/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs @@ -88,12 +88,7 @@ namespace Umbraco.Core.Persistence.Repositories if(latestVersionDto.VersionId == dto.VersionId) return; - using (var transaction = Database.GetTransaction()) - { - PerformDeleteVersion(dto.NodeId, versionId); - - transaction.Complete(); - } + PerformDeleteVersion(dto.NodeId, versionId); } public virtual void DeleteVersions(int id, DateTime versionDate) @@ -106,14 +101,9 @@ namespace Umbraco.Core.Persistence.Repositories new { /*VersionId =*/ latestVersionDto.VersionId, Id = id, VersionDate = versionDate}); if (list.Any() == false) return; - using (var transaction = Database.GetTransaction()) // fixme - though... already in a unit of work? + foreach (var dto in list) { - foreach (var dto in list) - { - PerformDeleteVersion(id, dto.VersionId); - } - - transaction.Complete(); + PerformDeleteVersion(id, dto.VersionId); } } diff --git a/src/Umbraco.Core/Services/ExternalLoginService.cs b/src/Umbraco.Core/Services/ExternalLoginService.cs index c38daafc0f..6a0d2b1c14 100644 --- a/src/Umbraco.Core/Services/ExternalLoginService.cs +++ b/src/Umbraco.Core/Services/ExternalLoginService.cs @@ -58,6 +58,7 @@ namespace Umbraco.Core.Services { using (var uow = UowProvider.CreateUnitOfWork()) { + uow.Begin(); var repo = uow.CreateRepository(); repo.SaveUserLogins(userId, logins); uow.Complete(); @@ -72,6 +73,7 @@ namespace Umbraco.Core.Services { using (var uow = UowProvider.CreateUnitOfWork()) { + uow.Begin(); var repo = uow.CreateRepository(); repo.DeleteUserLogins(userId); uow.Complete(); diff --git a/src/Umbraco.Core/Services/NotificationService.cs b/src/Umbraco.Core/Services/NotificationService.cs index 59c5b9076d..f0ae977936 100644 --- a/src/Umbraco.Core/Services/NotificationService.cs +++ b/src/Umbraco.Core/Services/NotificationService.cs @@ -261,6 +261,7 @@ namespace Umbraco.Core.Services using (var uow = _uowProvider.CreateUnitOfWork()) { var repository = uow.CreateRepository(); + uow.Begin(); var notifications = repository.SetNotifications(user, entity, actions); uow.Complete(); return notifications; diff --git a/src/Umbraco.Core/Services/UserService.cs b/src/Umbraco.Core/Services/UserService.cs index 4498e64347..829543afe4 100644 --- a/src/Umbraco.Core/Services/UserService.cs +++ b/src/Umbraco.Core/Services/UserService.cs @@ -579,6 +579,7 @@ namespace Umbraco.Core.Services { using (var uow = UowProvider.CreateUnitOfWork()) { + uow.Begin(); var repository = uow.CreateRepository(); repository.ReplaceUserPermissions(userId, permissions, entityIds); uow.Complete(); @@ -595,6 +596,7 @@ namespace Umbraco.Core.Services { using (var uow = UowProvider.CreateUnitOfWork()) { + uow.Begin(); var repository = uow.CreateRepository(); repository.AssignUserPermission(userId, permission, entityIds); uow.Complete(); diff --git a/src/Umbraco.Tests/Persistence/NPocoExtensionsTest.cs b/src/Umbraco.Tests/Persistence/NPocoExtensionsTest.cs index eb4bdfc23e..d8f781ac77 100644 --- a/src/Umbraco.Tests/Persistence/NPocoExtensionsTest.cs +++ b/src/Umbraco.Tests/Persistence/NPocoExtensionsTest.cs @@ -48,7 +48,7 @@ namespace Umbraco.Tests.Persistence // Act using (ProfilingLogger.TraceDuration("starting insert", "finished insert")) { - db.BulkInsertRecords(SqlSyntax, servers); + db.BulkInsertRecordsWithTransaction(SqlSyntax, servers); } // Assert diff --git a/src/Umbraco.Tests/Services/PerformanceTests.cs b/src/Umbraco.Tests/Services/PerformanceTests.cs index f187d421f4..821d41b984 100644 --- a/src/Umbraco.Tests/Services/PerformanceTests.cs +++ b/src/Umbraco.Tests/Services/PerformanceTests.cs @@ -195,7 +195,7 @@ namespace Umbraco.Tests.Services //now we insert each record for the ones we've deleted like we do in the content service. var xmlItems = nodes.Select(node => new ContentXmlDto { NodeId = node.NodeId, Xml = UpdatedXmlStructure }).ToList(); - DatabaseContext.Database.BulkInsertRecords(SqlSyntax, xmlItems); + DatabaseContext.Database.BulkInsertRecordsWithTransaction(SqlSyntax, xmlItems); } } @@ -284,7 +284,7 @@ namespace Umbraco.Tests.Services Path = "" }); } - DatabaseContext.Database.BulkInsertRecords(SqlSyntax, nodes); + DatabaseContext.Database.BulkInsertRecordsWithTransaction(SqlSyntax, nodes); //re-get the nodes with ids var sql = DatabaseContext.Database.Sql(); @@ -294,11 +294,11 @@ namespace Umbraco.Tests.Services //create the cmsContent data, each with a new content type id (so we can query on it later if needed) var contentTypeId = 0; var cmsContentItems = nodes.Select(node => new ContentDto { NodeId = node.NodeId, ContentTypeId = contentTypeId++ }).ToList(); - DatabaseContext.Database.BulkInsertRecords(SqlSyntax, cmsContentItems); + DatabaseContext.Database.BulkInsertRecordsWithTransaction(SqlSyntax, cmsContentItems); //create the xml data var xmlItems = nodes.Select(node => new ContentXmlDto { NodeId = node.NodeId, Xml = TestXmlStructure }).ToList(); - DatabaseContext.Database.BulkInsertRecords(SqlSyntax, xmlItems); + DatabaseContext.Database.BulkInsertRecordsWithTransaction(SqlSyntax, xmlItems); return nodes; } diff --git a/src/Umbraco.Web/PublishedCache/NuCache/FacadeService.cs b/src/Umbraco.Web/PublishedCache/NuCache/FacadeService.cs index ed387d3bea..eae83ad54f 100644 --- a/src/Umbraco.Web/PublishedCache/NuCache/FacadeService.cs +++ b/src/Umbraco.Web/PublishedCache/NuCache/FacadeService.cs @@ -1233,8 +1233,7 @@ WHERE cmsContentNu.nodeId IN ( } items.AddRange(guids.Select(x => GetDto(repository.GetByVersion(x), true))); - // ReSharper disable once RedundantArgumentDefaultValue - db.BulkInsertRecords(db.SqlSyntax, items, null, false); // run within the current transaction and do NOT commit + db.BulkInsertRecords(db.SqlSyntax, items); processed += items.Count; } while (processed < total); } @@ -1293,8 +1292,7 @@ WHERE cmsContentNu.nodeId IN ( { var descendants = repository.GetPagedResultsByQuery(query, pageIndex++, groupSize, out total, "Path", Direction.Ascending, true); var items = descendants.Select(m => GetDto(m, true)).ToArray(); - // ReSharper disable once RedundantArgumentDefaultValue - db.BulkInsertRecords(db.SqlSyntax, items, null, false); // run within the current transaction and do NOT commit + db.BulkInsertRecords(db.SqlSyntax, items); processed += items.Length; } while (processed < total); } @@ -1353,8 +1351,7 @@ WHERE cmsContentNu.nodeId IN ( { var descendants = repository.GetPagedResultsByQuery(query, pageIndex++, groupSize, out total, "Path", Direction.Ascending, true); var items = descendants.Select(m => GetDto(m, true)).ToArray(); - // ReSharper disable once RedundantArgumentDefaultValue - db.BulkInsertRecords(db.SqlSyntax, items, null, false); // run within the current transaction and do NOT commit + db.BulkInsertRecords(db.SqlSyntax, items); processed += items.Length; } while (processed < total); } diff --git a/src/Umbraco.Web/PublishedCache/XmlPublishedCache/XmlStore.cs b/src/Umbraco.Web/PublishedCache/XmlPublishedCache/XmlStore.cs index 7f0f96a990..4bdb6029b7 100644 --- a/src/Umbraco.Web/PublishedCache/XmlPublishedCache/XmlStore.cs +++ b/src/Umbraco.Web/PublishedCache/XmlPublishedCache/XmlStore.cs @@ -1867,7 +1867,7 @@ WHERE cmsContentXml.nodeId IN ( // because we already have the condition on the content being published var descendants = repository.GetPagedResultsByQuery(query, pageIndex++, groupSize, out total, "Path", Direction.Ascending, true, newest: false); var items = descendants.Select(c => new ContentXmlDto { NodeId = c.Id, Xml = _xmlContentSerializer(c).ToDataString() }).ToArray(); - db.BulkInsertRecords(db.SqlSyntax, items, null, false); // run within the current transaction and do NOT commit + db.BulkInsertRecords(db.SqlSyntax, items); processed += items.Length; } while (processed < total); } @@ -1942,7 +1942,7 @@ WHERE cmsPreviewXml.nodeId IN ( NodeId = c.Id, Xml = _xmlContentSerializer(c).ToDataString() }).ToArray(); - db.BulkInsertRecords(db.SqlSyntax, items, null, false); // run within the current transaction and do NOT commit + db.BulkInsertRecords(db.SqlSyntax, items); processed += items.Length; } while (processed < total); } @@ -2011,7 +2011,7 @@ WHERE cmsContentXml.nodeId IN ( { var descendants = repository.GetPagedResultsByQuery(query, pageIndex++, groupSize, out total, "Path", Direction.Ascending, true); var items = descendants.Select(m => new ContentXmlDto { NodeId = m.Id, Xml = _xmlMediaSerializer(m).ToDataString() }).ToArray(); - db.BulkInsertRecords(db.SqlSyntax, items, null, false); // run within the current transaction and do NOT commit + db.BulkInsertRecords(db.SqlSyntax, items); processed += items.Length; } while (processed < total); } @@ -2080,7 +2080,7 @@ WHERE cmsContentXml.nodeId IN ( { var descendants = repository.GetPagedResultsByQuery(query, pageIndex++, groupSize, out total, "Path", Direction.Ascending, true); var items = descendants.Select(m => new ContentXmlDto { NodeId = m.Id, Xml = _xmlMemberSerializer(m).ToDataString() }).ToArray(); - db.BulkInsertRecords(db.SqlSyntax, items, null, false); // run within the current transaction and do NOT commit + db.BulkInsertRecords(db.SqlSyntax, items); processed += items.Length; } while (processed < total); }