github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/internal/query/tx/control.go (about)

     1  package tx
     2  
     3  import (
     4  	"github.com/ydb-platform/ydb-go-genproto/protos/Ydb_Query"
     5  
     6  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/allocator"
     7  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/tx"
     8  )
     9  
    10  var (
    11  	_ interface {
    12  		ToYDB(a *allocator.Allocator) *Ydb_Query.TransactionControl
    13  	} = (*Control)(nil)
    14  	_ Selector = (*Settings)(nil)
    15  )
    16  
    17  type (
    18  	Selector interface {
    19  		applyTxSelector(a *allocator.Allocator, txControl *Ydb_Query.TransactionControl)
    20  	}
    21  	ControlOption interface {
    22  		applyTxControlOption(txControl *Control)
    23  	}
    24  	Control struct {
    25  		selector Selector
    26  		Commit   bool
    27  	}
    28  )
    29  
    30  func (ctrl *Control) ToYDB(a *allocator.Allocator) *Ydb_Query.TransactionControl {
    31  	if ctrl == nil {
    32  		return nil
    33  	}
    34  
    35  	txControl := a.QueryTransactionControl()
    36  	ctrl.selector.applyTxSelector(a, txControl)
    37  	txControl.CommitTx = ctrl.Commit
    38  
    39  	return txControl
    40  }
    41  
    42  func (ctrl *Control) Selector() Selector {
    43  	return ctrl.selector
    44  }
    45  
    46  var (
    47  	_ ControlOption = beginTxOptions{}
    48  	_ Selector      = beginTxOptions{}
    49  )
    50  
    51  type beginTxOptions []Option
    52  
    53  func (opts beginTxOptions) applyTxControlOption(txControl *Control) {
    54  	txControl.selector = opts
    55  }
    56  
    57  func (opts beginTxOptions) applyTxSelector(a *allocator.Allocator, txControl *Ydb_Query.TransactionControl) {
    58  	selector := a.QueryTransactionControlBeginTx()
    59  	selector.BeginTx = a.QueryTransactionSettings()
    60  	for _, opt := range opts {
    61  		if opt != nil {
    62  			opt.ApplyTxSettingsOption(a, selector.BeginTx)
    63  		}
    64  	}
    65  	txControl.TxSelector = selector
    66  }
    67  
    68  // BeginTx returns selector transaction control option
    69  func BeginTx(opts ...Option) beginTxOptions {
    70  	return opts
    71  }
    72  
    73  var (
    74  	_ ControlOption = txIDTxControlOption("")
    75  	_ Selector      = txIDTxControlOption("")
    76  )
    77  
    78  type txIDTxControlOption string
    79  
    80  func (id txIDTxControlOption) applyTxControlOption(txControl *Control) {
    81  	txControl.selector = id
    82  }
    83  
    84  func (id txIDTxControlOption) applyTxSelector(a *allocator.Allocator, txControl *Ydb_Query.TransactionControl) {
    85  	selector := a.QueryTransactionControlTxID()
    86  	selector.TxId = string(id)
    87  	txControl.TxSelector = selector
    88  }
    89  
    90  func WithTx(t tx.Identifier) txIDTxControlOption {
    91  	return txIDTxControlOption(t.ID())
    92  }
    93  
    94  func WithTxID(txID string) txIDTxControlOption {
    95  	return txIDTxControlOption(txID)
    96  }
    97  
    98  type commitTxOption struct{}
    99  
   100  func (c commitTxOption) applyTxControlOption(txControl *Control) {
   101  	txControl.Commit = true
   102  }
   103  
   104  // CommitTx returns commit transaction control option
   105  func CommitTx() ControlOption {
   106  	return commitTxOption{}
   107  }
   108  
   109  // NewControl makes transaction control from given options
   110  func NewControl(opts ...ControlOption) *Control {
   111  	txControl := &Control{
   112  		selector: BeginTx(WithSerializableReadWrite()),
   113  		Commit:   false,
   114  	}
   115  	for _, opt := range opts {
   116  		if opt != nil {
   117  			opt.applyTxControlOption(txControl)
   118  		}
   119  	}
   120  
   121  	return txControl
   122  }
   123  
   124  func NoTx() *Control {
   125  	return nil
   126  }
   127  
   128  // DefaultTxControl returns default transaction control with serializable read-write isolation mode and auto-commit
   129  func DefaultTxControl() *Control {
   130  	return NoTx()
   131  }
   132  
   133  // SerializableReadWriteTxControl returns transaction control with serializable read-write isolation mode
   134  func SerializableReadWriteTxControl(opts ...ControlOption) *Control {
   135  	return NewControl(
   136  		append([]ControlOption{
   137  			BeginTx(WithSerializableReadWrite()),
   138  		}, opts...)...,
   139  	)
   140  }
   141  
   142  // OnlineReadOnlyTxControl returns online read-only transaction control
   143  func OnlineReadOnlyTxControl(opts ...OnlineReadOnlyOption) *Control {
   144  	return NewControl(
   145  		BeginTx(WithOnlineReadOnly(opts...)),
   146  		CommitTx(), // open transactions not supported for OnlineReadOnly
   147  	)
   148  }
   149  
   150  // StaleReadOnlyTxControl returns stale read-only transaction control
   151  func StaleReadOnlyTxControl() *Control {
   152  	return NewControl(
   153  		BeginTx(WithStaleReadOnly()),
   154  		CommitTx(), // open transactions not supported for StaleReadOnly
   155  	)
   156  }
   157  
   158  // SnapshotReadOnlyTxControl returns snapshot read-only transaction control
   159  func SnapshotReadOnlyTxControl() *Control {
   160  	return NewControl(
   161  		BeginTx(WithSnapshotReadOnly()),
   162  		CommitTx(), // open transactions not supported for StaleReadOnly
   163  	)
   164  }