github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/tests/integration/table_tx_lazy_test.go (about)

     1  //go:build integration
     2  // +build integration
     3  
     4  package integration
     5  
     6  import (
     7  	"context"
     8  	"os"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/stretchr/testify/require"
    13  
    14  	"github.com/ydb-platform/ydb-go-sdk/v3"
    15  	"github.com/ydb-platform/ydb-go-sdk/v3/table"
    16  	"github.com/ydb-platform/ydb-go-sdk/v3/table/options"
    17  )
    18  
    19  func TestTableTxLazy(t *testing.T) {
    20  	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
    21  	defer cancel()
    22  
    23  	var db *ydb.Driver
    24  
    25  	t.Run("connect", func(t *testing.T) {
    26  		var err error
    27  		db, err = ydb.Open(ctx, os.Getenv("YDB_CONNECTION_STRING"))
    28  		require.NoError(t, err)
    29  	})
    30  
    31  	require.NotNil(t, db)
    32  
    33  	t.Run("tx", func(t *testing.T) {
    34  		t.Run("lazy", func(t *testing.T) {
    35  			err := db.Table().Do(ctx,
    36  				func(ctx context.Context, s table.Session) (err error) {
    37  					// lazy open transaction on first execute query
    38  					tx, res, err := s.Execute(ctx, table.SerializableReadWriteTxControl(), "SELECT 1", nil)
    39  					if err != nil {
    40  						return err // for auto-retry with driver
    41  					}
    42  					defer res.Close() // cleanup resources
    43  					if err = res.Err(); err != nil {
    44  						return err
    45  					}
    46  					// close transaction on last execute query
    47  					res, err = tx.Execute(ctx, "SELECT 2", nil, options.WithCommit())
    48  					if err != nil {
    49  						return err
    50  					}
    51  					defer res.Close()
    52  					return res.Err()
    53  				},
    54  				table.WithIdempotent(),
    55  			)
    56  			require.NoError(t, err)
    57  		})
    58  	})
    59  
    60  	t.Run("disconnect", func(t *testing.T) {
    61  		err := db.Close(ctx)
    62  		require.NoError(t, err)
    63  	})
    64  }