go.mercari.io/datastore@v1.8.2/aedatastore/transaction_test.go (about) 1 package aedatastore 2 3 import ( 4 "testing" 5 6 w "go.mercari.io/datastore" 7 "google.golang.org/appengine" 8 "google.golang.org/appengine/aetest" 9 "google.golang.org/appengine/datastore" 10 ) 11 12 func TestAEDatastore_TransactionContext(t *testing.T) { 13 // for Transactional task enqueuing 14 // https://cloud.google.com/appengine/docs/standard/go/datastore/transactions#transactional_task_enqueuing 15 16 inst, err := aetest.NewInstance(&aetest.Options{StronglyConsistentDatastore: true}) 17 if err != nil { 18 t.Fatal(err) 19 } 20 defer inst.Close() 21 r, err := inst.NewRequest("GET", "/", nil) 22 if err != nil { 23 t.Fatal(err) 24 } 25 ctx := appengine.NewContext(r) 26 27 type Data struct { 28 Str string 29 } 30 31 client, err := FromContext(ctx) 32 if err != nil { 33 t.Fatal(err) 34 } 35 36 key := datastore.NewKey(ctx, "Data", "a", 0, nil) 37 _, err = datastore.Put(ctx, key, &Data{}) 38 if err != nil { 39 t.Fatal(err) 40 } 41 42 // ErrConcurrent will be occur 43 44 tx1, err := client.NewTransaction(ctx) 45 if err != nil { 46 t.Fatal(err) 47 } 48 tx2, err := client.NewTransaction(ctx) 49 if err != nil { 50 t.Fatal(err) 51 } 52 53 txCtx1 := TransactionContext(tx1) 54 txCtx2 := TransactionContext(tx2) 55 56 err = datastore.Get(txCtx1, key, &Data{}) 57 if err != nil { 58 t.Fatal(err) 59 } 60 err = datastore.Get(txCtx2, key, &Data{}) 61 if err != nil { 62 t.Fatal(err) 63 } 64 65 _, err = datastore.Put(txCtx1, key, &Data{Str: "#1"}) 66 if err != nil { 67 t.Fatal(err) 68 } 69 _, err = datastore.Put(txCtx2, key, &Data{Str: "#2"}) 70 if err != nil { 71 t.Fatal(err) 72 } 73 74 _, err = tx1.Commit() 75 if err != nil { 76 t.Fatal(err) 77 } 78 _, err = tx2.Commit() 79 if err != w.ErrConcurrentTransaction { 80 t.Fatal(err) 81 } 82 }