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 }