using Couchbase; using NLog.Extensions.Logging; using Couchbase.KeyValue; using Couchbase.Transactions; using Couchbase.Transactions.Config; var loggerFactory = new NLogLoggerFactory(new NLogProviderOptions { CaptureMessageTemplates = true, CaptureMessageProperties = true }); var clusterOptions = new ClusterOptions(). WithCredentials("Administrator", "password"). WithLogging(loggerFactory); var cluster = await Cluster.ConnectAsync("couchbase://localhost", clusterOptions); var bucket = await cluster.BucketAsync("transactionTest"); var collection = await bucket.DefaultCollectionAsync(); await collection.UpsertAsync("mylist", new List()); await AddFooClass.AddFoo(cluster, collection); await AddFooClass.AddFoo(cluster, collection); public class AddFooClass { public static async Task AddFoo(ICluster cluster, ICouchbaseCollection collection) { var config = TransactionConfigBuilder.Create(); config.DurabilityLevel(DurabilityLevel.None); var transaction = Transactions.Create(cluster, config); await transaction.RunAsync(async (context) => { var myListDoc = await context.GetAsync(collection, "mylist"); var myList = myListDoc.ContentAs>(); if (myList.Contains("foo")) { await context.RollbackAsync(); return; } myList.Add("foo"); await context.ReplaceAsync(myListDoc, myList); await context.CommitAsync(); }); await transaction.DisposeAsync(); } }