Files
caliverse_server/ServerBase/Entity/Transaction/EntityTransactionRunnerWithScopLock.cs
2025-05-01 07:20:41 +09:00

78 lines
2.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NeoSmart.AsyncLock;
using ServerCore; using ServerBase;
using MASTER_GUID = System.String;
namespace ServerBase;
public class EntityTransactionRunnerWithScopLock : IDisposable
{
private readonly EntityBase m_owner;
private readonly MASTER_GUID m_transact_master_guid;
public EntityTransactionRunnerWithScopLock(EntityBase owner, string transactMasterGuid = "")
{
m_owner = owner;
m_transact_master_guid = transactMasterGuid;
}
public void Dispose()
{
if (m_transact_master_guid.isNullOrWhiteSpace())
{
return;
}
var master_guid = m_owner.getMasterGuid();
if (m_transact_master_guid != master_guid)
{
Log.getLogger().error($"Not matched MasterGuid !!! - attachedMasterGuid:{master_guid} == settedMasterGuid:{m_transact_master_guid}");
return;
}
m_owner.detachMasterGuid();
}
public async Task<T> tryInvokeWithAsyncLock<T>(Func<Task<T>> func)
{
var owner = getOwner();
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var result = default(T);
var err_msg = string.Empty;
using (var releaser = await m_owner.getAsyncLock())
{
err_msg = $"AsyncLock() Start !!! - {m_owner.toBasicString()}";
Log.getLogger().debug(err_msg);
if(false == m_transact_master_guid.isNullOrWhiteSpace())
{
ConditionValidCheckHelper.throwIfFalseWithCondition( () => true == m_owner.attachMasterGuid(m_transact_master_guid)
, () => $"Failed to attach Master !!! : transactMasterGuid:{m_transact_master_guid} - {owner.toBasicString()}");
}
result = await func();
err_msg = $"AsyncLock() End !!! - {m_owner.toBasicString()}";
Log.getLogger().debug(err_msg);
}
return result;
}
public EntityBase getOwner() => m_owner;
}