public async Task RollbackTransaction(long transactionId) { if (Logger.IsEnabled(LogLevel.Trace)) { Logger.LogTrace("Start rollback transaction with id = {0},event counts = {1}, from version {2} to version {3}", GrainId.ToString(), WaitingForTransactionTransports.Count.ToString(), CurrentTransactionStartVersion.ToString(), Snapshot.Base.Version.ToString()); } if (CurrentTransactionId == transactionId && CurrentTransactionStartVersion != -1 && Snapshot.Base.Version >= CurrentTransactionStartVersion) { try { if (BackupSnapshot.Base.Version == CurrentTransactionStartVersion - 1) { Snapshot = new Snapshot <PrimaryKey, StateType>(GrainId) { Base = BackupSnapshot.Base.Clone(), State = BackupSnapshot.State.Clone() }; } else { if (BackupSnapshot.Base.Version >= CurrentTransactionStartVersion) { await EventStorage.DeleteAfter(Snapshot.Base.StateId, CurrentTransactionStartVersion, Snapshot.Base.LatestMinEventTimestamp); } await RecoverySnapshot(); } WaitingForTransactionTransports.Clear(); RestoreTransactionTemporaryState(); TransactionSemaphore.Release(); if (Logger.IsEnabled(LogLevel.Trace)) { Logger.LogTrace("Rollback transaction successfully with id = {0},state version = {1}", GrainId.ToString(), Snapshot.Base.Version.ToString()); } } catch (Exception ex) { Logger.LogCritical(ex, "Rollback transaction failed with Id = {1}", GrainId.ToString()); throw; } } }
public async Task RollbackTransaction(long transactionId) { if (CurrentTransactionId == transactionId && CurrentTransactionStartVersion != -1 && Snapshot.Base.Version >= CurrentTransactionStartVersion) { try { if (BackupSnapshot.Base.Version == CurrentTransactionStartVersion - 1) { Snapshot = new Snapshot <PrimaryKey, StateType>(GrainId) { Base = BackupSnapshot.Base.Clone(), State = BackupSnapshot.State.Clone() }; } else { if (BackupSnapshot.Base.Version >= CurrentTransactionStartVersion) { await EventStorage.DeleteAfter(Snapshot.Base.StateId, CurrentTransactionStartVersion, Snapshot.Base.LatestMinEventTimestamp); } await RecoverySnapshot(); } WaitingForTransactionTransports.Clear(); RestoreTransactionTemporaryState(); TransactionSemaphore.Release(); if (Logger.IsEnabled(LogLevel.Trace)) { Logger.LogTrace("Transaction rollbacked: {0}->{1}->{2}", GrainType.FullName, GrainId.ToString(), transactionId); } } catch (Exception ex) { Logger.LogCritical(ex, "Transaction rollback failed: {0}->{1}->{2}", GrainType.FullName, GrainId.ToString(), transactionId); throw; } } }