public void Write(string key, string value) { writtenKeys.AddOrUpdate(key, true, (k, v) => true); kvs.AcquireWriteLock(key, TransactionId); foreach (var siReadTransaction in kvs.GetTransactionsHoldingSiReadLocks(key)) { if (siReadTransaction == TransactionId) { continue; } AcquireAndExecureTransactionBlob(siReadTransaction, siTransactionBlob => { var siTransactionDescriptor = GetTransactionDescriptor(siTransactionBlob, null); var siTransactionIsRunning = (siTransactionDescriptor.Status == TransactionStatus.Running); TransactionDescriptor currentTransactionDescriptor = null; AcquireAndExecureTransactionBlob(TransactionId, currentTransactionBlob => { currentTransactionDescriptor = GetTransactionDescriptor(currentTransactionBlob, null); if (siTransactionIsRunning || siTransactionBlob.Properties.LastModified > currentTransactionBlob.Properties.Created) { if (siTransactionDescriptor.Status == TransactionStatus.CompletedWithSuccess && siTransactionDescriptor.InConflict) { currentTransactionDescriptor.InConflict = true; currentTransactionDescriptor.OutConflict = true; SetTransactionDescriptor(currentTransactionBlob, currentTransactionDescriptor); } else { siTransactionDescriptor.OutConflict = true; currentTransactionDescriptor.InConflict = true; SetTransactionDescriptor(currentTransactionBlob, currentTransactionDescriptor); SetTransactionDescriptor(siTransactionBlob, siTransactionDescriptor); } } }); }); } ulong version = 0; ulong newVersion = 0; if (keyVersions.TryGetValue(key, out version)) { newVersion = kvs.Update(key, value, version, TransactionId); } else { newVersion = kvs.Create(key, value, TransactionId); } keyVersions.AddOrUpdate(key, newVersion, (k, v) => newVersion); }
public void Begin_Tran_With_Name_And_Distribution(string sql, string name, TransactionDescriptor descriptor, bool distributed) { // Exercise BeginTransactionStatement statement = ParserFactory.Execute <BeginTransactionStatement>(sql).First(); // Verify outcome Assert.IsNotNull(statement); Assert.AreEqual(name, statement.Name); Assert.AreEqual(descriptor, statement.Descriptor); Assert.AreEqual(distributed, statement.Distributed); }
public void Begin_Tran_With_Name_And_Distribution( string sql, string name, TransactionDescriptor descriptor, bool distributed ) { // Exercise BeginTransactionStatement statement = ParserFactory.Execute<BeginTransactionStatement>( sql ).First(); // Verify outcome Assert.IsNotNull( statement ); Assert.AreEqual( name, statement.Name ); Assert.AreEqual(descriptor, statement.Descriptor ); Assert.AreEqual( distributed, statement.Distributed ); }
public TransactionDescriptor GetTransactionDescriptor(CloudBlockBlob transactionBlob, TransactionDescriptor defaultDescriptor) { transactionBlob.FetchAttributes(); if (transactionBlob.Metadata.ContainsKey("TransactionDescriptor")) { return(JsonConvert.DeserializeObject <TransactionDescriptor>(transactionBlob.Metadata["TransactionDescriptor"])); } return(defaultDescriptor); }
public void SetTransactionDescriptor(CloudBlockBlob transactionBlob, TransactionDescriptor transactionDescriptor) { //transactionBlob.UploadText(JsonConvert.SerializeObject(transactionDescriptor)); transactionBlob.Metadata["TransactionDescriptor"] = JsonConvert.SerializeObject(transactionDescriptor); }