using ZB.MOM.WW.CBDD.Core; using ZB.MOM.WW.CBDD.Core.Storage; using ZB.MOM.WW.CBDD.Core.Transactions; namespace ZB.MOM.WW.CBDD.Tests.Benchmark; internal sealed class BenchmarkTransactionHolder : ITransactionHolder, IDisposable { private readonly StorageEngine _storage; private readonly object _sync = new(); private ITransaction? _currentTransaction; /// /// Initializes a new instance of the class. /// /// The storage engine used to create transactions. public BenchmarkTransactionHolder(StorageEngine storage) { _storage = storage ?? throw new ArgumentNullException(nameof(storage)); } /// /// Gets the current active transaction or starts a new one. /// /// The current active transaction. public ITransaction GetCurrentTransactionOrStart() { lock (_sync) { if (_currentTransaction == null || _currentTransaction.State != TransactionState.Active) { _currentTransaction = _storage.BeginTransaction(); } return _currentTransaction; } } /// /// Gets the current active transaction or starts a new one asynchronously. /// /// A task that returns the current active transaction. public Task GetCurrentTransactionOrStartAsync() { return Task.FromResult(GetCurrentTransactionOrStart()); } /// /// Commits the current transaction when active and clears the holder. /// public void CommitAndReset() { lock (_sync) { if (_currentTransaction == null) { return; } if (_currentTransaction.State == TransactionState.Active || _currentTransaction.State == TransactionState.Preparing) { _currentTransaction.Commit(); } _currentTransaction.Dispose(); _currentTransaction = null; } } /// /// Rolls back the current transaction when active and clears the holder. /// public void RollbackAndReset() { lock (_sync) { if (_currentTransaction == null) { return; } if (_currentTransaction.State == TransactionState.Active || _currentTransaction.State == TransactionState.Preparing) { _currentTransaction.Rollback(); } _currentTransaction.Dispose(); _currentTransaction = null; } } /// /// Disposes this holder and rolls back any outstanding transaction. /// public void Dispose() { RollbackAndReset(); } }