func ExampleTransaction() { ctx := Example_auth() const retries = 3 // Increment a counter. // See https://cloud.google.com/appengine/articles/sharding_counters for // a more scalable solution. type Counter struct { Count int } key := datastore.NewKey(ctx, "counter", "CounterA", 0, nil) for i := 0; i < retries; i++ { tx, err := datastore.NewTransaction(ctx) if err != nil { break } var c Counter if err := tx.Get(key, &c); err != nil && err != datastore.ErrNoSuchEntity { break } c.Count++ if _, err := tx.Put(key, &c); err != nil { break } // Attempt to commit the transaction. If there's a conflict, try again. if _, err := tx.Commit(); err != datastore.ErrConcurrentTransaction { break } } }
// LogRunComplete logs the end of a completed (failed of finished) run of // a coduno testrun func LogRunComplete(pKey *datastore.Key, build *BuildData, in, out, extra string, exit error, prepLog string, stats syscall.Rusage) { tx, err := datastore.NewTransaction(ctx) if err != nil { fmt.Fprintf(os.Stderr, "LogRunComplete: Could not get transaction!") } build.EndTime = time.Now() if exit != nil { build.Status = "failed" } else { build.Status = "good" } _, err = tx.Put(pKey, build) if err != nil { fmt.Fprintf(os.Stderr, "LogRunComplete: Putting build failed!") tx.Rollback() return } data := &LogData{in, out, extra, prepLog, stats} k := datastore.NewIncompleteKey(ctx, buildKind, pKey) _, err = tx.Put(k, data) if err != nil { fmt.Fprintf(os.Stderr, "LogRunComplete: Putting data failed!") tx.Rollback() return } tx.Commit() }