diff --git a/src/Umbraco.Core/Runtime/SqlMainDomLock.cs b/src/Umbraco.Core/Runtime/SqlMainDomLock.cs
index 4433a8e307..27b016b2af 100644
--- a/src/Umbraco.Core/Runtime/SqlMainDomLock.cs
+++ b/src/Umbraco.Core/Runtime/SqlMainDomLock.cs
@@ -3,8 +3,10 @@ using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Linq;
+using System.Security.Cryptography;
using System.Threading;
using System.Threading.Tasks;
+using System.Web;
using Umbraco.Core.Logging;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.Dtos;
@@ -16,7 +18,7 @@ namespace Umbraco.Core.Runtime
internal class SqlMainDomLock : IMainDomLock
{
private string _lockId;
- private const string MainDomKey = "Umbraco.Core.Runtime.SqlMainDom";
+ private const string MainDomKeyPrefix = "Umbraco.Core.Runtime.SqlMainDom";
private const string UpdatedSuffix = "_updated";
private readonly ILogger _logger;
private IUmbracoDatabase _db;
@@ -119,6 +121,16 @@ namespace Umbraco.Core.Runtime
}
+ ///
+ /// Returns the keyvalue table key for the current server/app
+ ///
+ ///
+ /// The key is the the normal MainDomId which takes into account the AppDomainAppId and the physical file path of the app and this is
+ /// combined with the current machine name. The machine name is required because the default semaphore lock is machine wide so it implicitly
+ /// takes into account machine name whereas this needs to be explicitly per machine.
+ ///
+ private string MainDomKey { get; } = MainDomKeyPrefix + "-" + (NetworkHelper.MachineName + MainDom.GetMainDomId()).GenerateHash();
+
private void ListeningLoop()
{
while (true)