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  }