public void RecordRead(ITransactionalResource transactionalResource, TransactionalResourceVersion readVersion, long stableVersion) { if (readVersion.TransactionId == TransactionId) { // Just reading our own write here. // Sanity check to see if there's a lost write. int resourceWriteNumber; if (WriteSet.TryGetValue(transactionalResource, out resourceWriteNumber) && resourceWriteNumber > readVersion.WriteNumber) { // Context has record of more writes than we have, some writes must be lost. throw new OrleansTransactionAbortedException(TransactionId, "Lost Write"); } } else { TransactionalResourceVersion resourceReadVersion; if (ReadSet.TryGetValue(transactionalResource, out resourceReadVersion) && resourceReadVersion != readVersion) { // Uh-oh. Read two different versions of the grain. throw new OrleansValidationFailedException(TransactionId); } ReadSet[transactionalResource] = readVersion; if (readVersion.TransactionId != TransactionId && readVersion.TransactionId > stableVersion) { DependentTransactions.Add(readVersion.TransactionId); } } }
public void RecordWrite(ITransactionalResource transactionalResource, TransactionalResourceVersion latestVersion, long stableVersion) { int writeNumber; WriteSet.TryGetValue(transactionalResource, out writeNumber); WriteSet[transactionalResource] = writeNumber + 1; if (latestVersion.TransactionId != TransactionId && latestVersion.TransactionId > stableVersion) { DependentTransactions.Add(latestVersion.TransactionId); } }