Skip to content

Commit 4a76df9

Browse files
committed
Added Isolation concept
1 parent 4ebb2e4 commit 4a76df9

File tree

5 files changed

+188
-11
lines changed

5 files changed

+188
-11
lines changed

internal/query/transaction.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func begin(
4545
response, err := client.BeginTransaction(ctx,
4646
&Ydb_Query.BeginTransactionRequest{
4747
SessionId: sessionID,
48-
TxSettings: txSettings.ToYdbQuerySettings(),
48+
TxSettings: txSettings.ToQuerySettings(),
4949
},
5050
)
5151
if err != nil {
@@ -185,7 +185,7 @@ func (tx *Transaction) txControl() *baseTx.Control {
185185
}
186186

187187
return baseTx.NewControl(
188-
baseTx.BeginTx(tx.txSettings...),
188+
tx.txSettings,
189189
)
190190
}
191191

internal/tx/isolation.go

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package tx
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/ydb-platform/ydb-go-genproto/protos/Ydb_Query"
7+
"github.com/ydb-platform/ydb-go-genproto/protos/Ydb_Table"
8+
)
9+
10+
type Isolation int
11+
12+
func (iso Isolation) ToTableSettings() *Ydb_Table.TransactionSettings {
13+
return iso.tableTxSelector().BeginTx
14+
}
15+
16+
func (iso Isolation) ToQuerySettings() *Ydb_Query.TransactionSettings {
17+
return iso.queryTxSelector().BeginTx
18+
}
19+
20+
func (iso Isolation) applyQueryTxSelector(txControl *Ydb_Query.TransactionControl) {
21+
txControl.TxSelector = iso.queryTxSelector()
22+
}
23+
24+
func (iso Isolation) applyTableTxSelector(txControl *Ydb_Table.TransactionControl) {
25+
txControl.TxSelector = iso.tableTxSelector()
26+
}
27+
28+
func (iso Isolation) applyTxControlOption(txControl *Control) {
29+
txControl.selector = iso
30+
}
31+
32+
func (iso Isolation) tableTxSelector() *Ydb_Table.TransactionControl_BeginTx {
33+
switch iso {
34+
case SerializableRW:
35+
return tableSerializableReadWriteTxSelector
36+
case SnapshotRO:
37+
return tableSnapshotReadOnlyTxSelector
38+
case OnlineRO:
39+
return tableOnlineReadOnlyForbidInconsistentReadsTxSelector
40+
case OnlineROWithInconsistentReads:
41+
return tableOnlineReadOnlyAllowInconsistentReadsTxSelector
42+
case StaleRO:
43+
return tableStaleReadOnlyTxSelector
44+
default:
45+
panic(fmt.Sprintf("unknown isolation: %d", iso))
46+
}
47+
}
48+
49+
func (iso Isolation) queryTxSelector() *Ydb_Query.TransactionControl_BeginTx {
50+
switch iso {
51+
case SerializableRW:
52+
return querySerializableReadWriteTxSelector
53+
case SnapshotRO:
54+
return querySnapshotReadOnlyTxSelector
55+
case OnlineRO:
56+
return queryOnlineReadOnlyForbidInconsistentReadsTxSelector
57+
case OnlineROWithInconsistentReads:
58+
return queryOnlineReadOnlyAllowInconsistentReadsTxSelector
59+
case StaleRO:
60+
return queryStaleReadOnlyTxSelector
61+
default:
62+
panic(fmt.Sprintf("unknown isolation: %d", iso))
63+
}
64+
}
65+
66+
const (
67+
SerializableRW = Isolation(iota)
68+
SnapshotRO
69+
OnlineRO
70+
OnlineROWithInconsistentReads
71+
StaleRO
72+
)
73+
74+
var _ Settings = Isolation(0)

internal/tx/settings.go

+91-6
Original file line numberDiff line numberDiff line change
@@ -9,33 +9,83 @@ var (
99
querySerializableReadWrite = &Ydb_Query.TransactionSettings_SerializableReadWrite{
1010
SerializableReadWrite: &Ydb_Query.SerializableModeSettings{},
1111
}
12+
querySerializableReadWriteTxSelector = &Ydb_Query.TransactionControl_BeginTx{
13+
BeginTx: &Ydb_Query.TransactionSettings{
14+
TxMode: querySerializableReadWrite,
15+
},
16+
}
1217
queryStaleReadOnly = &Ydb_Query.TransactionSettings_StaleReadOnly{
1318
StaleReadOnly: &Ydb_Query.StaleModeSettings{},
1419
}
20+
queryStaleReadOnlyTxSelector = &Ydb_Query.TransactionControl_BeginTx{
21+
BeginTx: &Ydb_Query.TransactionSettings{
22+
TxMode: queryStaleReadOnly,
23+
},
24+
}
1525
querySnapshotReadOnly = &Ydb_Query.TransactionSettings_SnapshotReadOnly{
1626
SnapshotReadOnly: &Ydb_Query.SnapshotModeSettings{},
1727
}
28+
querySnapshotReadOnlyTxSelector = &Ydb_Query.TransactionControl_BeginTx{
29+
BeginTx: &Ydb_Query.TransactionSettings{
30+
TxMode: querySnapshotReadOnly,
31+
},
32+
}
1833
queryOnlineReadOnlyAllowInconsistentReads = &Ydb_Query.TransactionSettings_OnlineReadOnly{
1934
OnlineReadOnly: &Ydb_Query.OnlineModeSettings{AllowInconsistentReads: true},
2035
}
36+
queryOnlineReadOnlyAllowInconsistentReadsTxSelector = &Ydb_Query.TransactionControl_BeginTx{
37+
BeginTx: &Ydb_Query.TransactionSettings{
38+
TxMode: queryOnlineReadOnlyAllowInconsistentReads,
39+
},
40+
}
2141
queryOnlineReadOnlyForbidInconsistentReads = &Ydb_Query.TransactionSettings_OnlineReadOnly{
2242
OnlineReadOnly: &Ydb_Query.OnlineModeSettings{AllowInconsistentReads: false},
2343
}
44+
queryOnlineReadOnlyForbidInconsistentReadsTxSelector = &Ydb_Query.TransactionControl_BeginTx{
45+
BeginTx: &Ydb_Query.TransactionSettings{
46+
TxMode: queryOnlineReadOnlyForbidInconsistentReads,
47+
},
48+
}
2449
tableSerializableReadWrite = &Ydb_Table.TransactionSettings_SerializableReadWrite{
2550
SerializableReadWrite: &Ydb_Table.SerializableModeSettings{},
2651
}
52+
tableSerializableReadWriteTxSelector = &Ydb_Table.TransactionControl_BeginTx{
53+
BeginTx: &Ydb_Table.TransactionSettings{
54+
TxMode: tableSerializableReadWrite,
55+
},
56+
}
2757
tableStaleReadOnly = &Ydb_Table.TransactionSettings_StaleReadOnly{
2858
StaleReadOnly: &Ydb_Table.StaleModeSettings{},
2959
}
60+
tableStaleReadOnlyTxSelector = &Ydb_Table.TransactionControl_BeginTx{
61+
BeginTx: &Ydb_Table.TransactionSettings{
62+
TxMode: tableStaleReadOnly,
63+
},
64+
}
3065
tableSnapshotReadOnly = &Ydb_Table.TransactionSettings_SnapshotReadOnly{
3166
SnapshotReadOnly: &Ydb_Table.SnapshotModeSettings{},
3267
}
68+
tableSnapshotReadOnlyTxSelector = &Ydb_Table.TransactionControl_BeginTx{
69+
BeginTx: &Ydb_Table.TransactionSettings{
70+
TxMode: tableSnapshotReadOnly,
71+
},
72+
}
3373
tableOnlineReadOnlyAllowInconsistentReads = &Ydb_Table.TransactionSettings_OnlineReadOnly{
3474
OnlineReadOnly: &Ydb_Table.OnlineModeSettings{AllowInconsistentReads: true},
3575
}
76+
tableOnlineReadOnlyAllowInconsistentReadsTxSelector = &Ydb_Table.TransactionControl_BeginTx{
77+
BeginTx: &Ydb_Table.TransactionSettings{
78+
TxMode: tableOnlineReadOnlyAllowInconsistentReads,
79+
},
80+
}
3681
tableOnlineReadOnlyForbidInconsistentReads = &Ydb_Table.TransactionSettings_OnlineReadOnly{
3782
OnlineReadOnly: &Ydb_Table.OnlineModeSettings{AllowInconsistentReads: false},
3883
}
84+
tableOnlineReadOnlyForbidInconsistentReadsTxSelector = &Ydb_Table.TransactionControl_BeginTx{
85+
BeginTx: &Ydb_Table.TransactionSettings{
86+
TxMode: tableOnlineReadOnlyForbidInconsistentReads,
87+
},
88+
}
3989
)
4090

4191
// Transaction settings options
@@ -44,10 +94,45 @@ type (
4494
ApplyQueryTxSettingsOption(txSettings *Ydb_Query.TransactionSettings)
4595
ApplyTableTxSettingsOption(txSettings *Ydb_Table.TransactionSettings)
4696
}
47-
Settings []SettingsOption
97+
Settings interface {
98+
ControlOption
99+
Selector
100+
101+
ToTableSettings() *Ydb_Table.TransactionSettings
102+
ToQuerySettings() *Ydb_Query.TransactionSettings
103+
}
104+
Options []SettingsOption
48105
)
49106

50-
func (opts Settings) applyTableTxSelector(txControl *Ydb_Table.TransactionControl) {
107+
func (opts Options) applyTxControlOption(txControl *Control) {
108+
txControl.selector = BeginTx(opts...)
109+
}
110+
111+
func (opts Options) ToTableSettings() *Ydb_Table.TransactionSettings {
112+
txSettings := &Ydb_Table.TransactionSettings{}
113+
for _, opt := range opts {
114+
if opt != nil {
115+
opt.ApplyTableTxSettingsOption(txSettings)
116+
}
117+
}
118+
119+
return txSettings
120+
}
121+
122+
func (opts Options) ToQuerySettings() *Ydb_Query.TransactionSettings {
123+
txSettings := &Ydb_Query.TransactionSettings{}
124+
for _, opt := range opts {
125+
if opt != nil {
126+
opt.ApplyQueryTxSettingsOption(txSettings)
127+
}
128+
}
129+
130+
return txSettings
131+
}
132+
133+
var _ Settings = Options(nil)
134+
135+
func (opts Options) applyTableTxSelector(txControl *Ydb_Table.TransactionControl) {
51136
beginTx := &Ydb_Table.TransactionControl_BeginTx{
52137
BeginTx: &Ydb_Table.TransactionSettings{},
53138
}
@@ -59,7 +144,7 @@ func (opts Settings) applyTableTxSelector(txControl *Ydb_Table.TransactionContro
59144
txControl.TxSelector = beginTx
60145
}
61146

62-
func (opts Settings) applyQueryTxSelector(txControl *Ydb_Query.TransactionControl) {
147+
func (opts Options) applyQueryTxSelector(txControl *Ydb_Query.TransactionControl) {
63148
beginTx := &Ydb_Query.TransactionControl_BeginTx{
64149
BeginTx: &Ydb_Query.TransactionSettings{},
65150
}
@@ -71,7 +156,7 @@ func (opts Settings) applyQueryTxSelector(txControl *Ydb_Query.TransactionContro
71156
txControl.TxSelector = beginTx
72157
}
73158

74-
func (opts Settings) ToYdbQuerySettings() *Ydb_Query.TransactionSettings {
159+
func (opts Options) ToYdbQuerySettings() *Ydb_Query.TransactionSettings {
75160
txSettings := &Ydb_Query.TransactionSettings{}
76161
for _, opt := range opts {
77162
if opt != nil {
@@ -82,7 +167,7 @@ func (opts Settings) ToYdbQuerySettings() *Ydb_Query.TransactionSettings {
82167
return txSettings
83168
}
84169

85-
func (opts Settings) ToYdbTableSettings() *Ydb_Table.TransactionSettings {
170+
func (opts Options) ToYdbTableSettings() *Ydb_Table.TransactionSettings {
86171
txSettings := &Ydb_Table.TransactionSettings{}
87172
for _, opt := range opts {
88173
if opt != nil {
@@ -94,7 +179,7 @@ func (opts Settings) ToYdbTableSettings() *Ydb_Table.TransactionSettings {
94179
}
95180

96181
// NewSettings returns transaction settings
97-
func NewSettings(opts ...SettingsOption) Settings {
182+
func NewSettings(opts ...SettingsOption) Options {
98183
return opts
99184
}
100185

query/transaction.go

+20-2
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,27 @@ type (
1818
CommitTx(ctx context.Context) (err error)
1919
Rollback(ctx context.Context) (err error)
2020
}
21-
TransactionControl = tx.Control
21+
22+
// TransactionControl is a special YDB object for define how to start (TransactionSettings) and end (CommitTx flag)
23+
// of transaction per each query
24+
// Deprecated: doesn't exists any use cases, when CommitTx=false
25+
TransactionControl = tx.Control
26+
2227
TransactionSettings = tx.Settings
2328
TransactionOption = tx.SettingsOption
29+
30+
// Isolation is well-known definition about isolation concurrent transactions
31+
// The closest concept of isolation in ydb is transaction settings.
32+
// Almost TransactionSettings matches to standard isolation levels (excluding OnlineReadOnly)
33+
Isolation = tx.Settings
34+
)
35+
36+
const (
37+
SerializableRW = tx.SerializableRW
38+
SnapshotRO = tx.SnapshotRO
39+
OnlineRO = tx.OnlineRO
40+
OnlineROWithInconsistentReads = tx.OnlineROWithInconsistentReads
41+
StaleRO = tx.StaleRO
2442
)
2543

2644
// BeginTx returns selector transaction control option
@@ -96,7 +114,7 @@ func SnapshotReadOnlyTxControl() *TransactionControl {
96114

97115
// TxSettings returns transaction settings
98116
func TxSettings(opts ...tx.SettingsOption) TransactionSettings {
99-
return opts
117+
return tx.NewSettings(opts...)
100118
}
101119

102120
func WithDefaultTxMode() TransactionOption {

table/table.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ type Session interface {
177177
}
178178

179179
type (
180-
TransactionSettings = tx.Settings
180+
TransactionSettings = tx.Options
181181
// Transaction control options
182182
TxOption = tx.SettingsOption
183183
)

0 commit comments

Comments
 (0)