Skip to content

Commit 5a37f51

Browse files
authored
Merge pull request #882 from ydb-platform/LevelSerializable
* Allowed `sql.LevelSerializable` isolation level in read-write mode …
2 parents 4ae0dcb + da83f91 commit 5a37f51

File tree

3 files changed

+32
-12
lines changed

3 files changed

+32
-12
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
* Allowed `sql.LevelSerializable` isolation level in read-write mode in `database/sql` transactions
12
* Refactored traces and metrics
23
* Added `{retry,table}.WithLabel` options for mark retriers calls
34
* Added `ydb.WithTraceRetry` option

internal/xsql/isolation/isolation.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,15 @@ import (
1515
// It returns error on unsupported options.
1616
func ToYDB(opts driver.TxOptions) (txcControl table.TxOption, err error) {
1717
level := sql.IsolationLevel(opts.Isolation)
18-
if !opts.ReadOnly && level == sql.LevelDefault {
19-
return table.WithSerializableReadWrite(), nil
20-
}
21-
if opts.ReadOnly && level == sql.LevelSnapshot {
22-
return table.WithSnapshotReadOnly(), nil
18+
switch level {
19+
case sql.LevelDefault, sql.LevelSerializable:
20+
if !opts.ReadOnly {
21+
return table.WithSerializableReadWrite(), nil
22+
}
23+
case sql.LevelSnapshot:
24+
if opts.ReadOnly {
25+
return table.WithSnapshotReadOnly(), nil
26+
}
2327
}
2428
return nil, xerrors.WithStackTrace(fmt.Errorf(
2529
"unsupported transaction options: %+v", opts,

internal/xsql/isolation/isolation_test.go

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,24 @@ package isolation
33
import (
44
"database/sql"
55
"database/sql/driver"
6-
"fmt"
76
"testing"
87

98
"github.com/stretchr/testify/require"
10-
"google.golang.org/protobuf/proto"
119

10+
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xtest"
1211
"github.com/ydb-platform/ydb-go-sdk/v3/table"
1312
)
1413

1514
func TestToYDB(t *testing.T) {
1615
for _, tt := range []struct {
16+
name string
1717
txOptions driver.TxOptions
1818
txControl table.TxOption
1919
err bool
2020
}{
2121
// read-write
2222
{
23+
name: xtest.CurrentFileLine(),
2324
txOptions: driver.TxOptions{
2425
Isolation: driver.IsolationLevel(sql.LevelDefault),
2526
ReadOnly: false,
@@ -28,48 +29,56 @@ func TestToYDB(t *testing.T) {
2829
err: false,
2930
},
3031
{
32+
name: xtest.CurrentFileLine(),
3133
txOptions: driver.TxOptions{
3234
Isolation: driver.IsolationLevel(sql.LevelReadUncommitted),
3335
ReadOnly: false,
3436
},
3537
err: true,
3638
},
3739
{
40+
name: xtest.CurrentFileLine(),
3841
txOptions: driver.TxOptions{
3942
Isolation: driver.IsolationLevel(sql.LevelReadCommitted),
4043
ReadOnly: false,
4144
},
4245
err: true,
4346
},
4447
{
48+
name: xtest.CurrentFileLine(),
4549
txOptions: driver.TxOptions{
4650
Isolation: driver.IsolationLevel(sql.LevelWriteCommitted),
4751
ReadOnly: false,
4852
},
4953
err: true,
5054
},
5155
{
56+
name: xtest.CurrentFileLine(),
5257
txOptions: driver.TxOptions{
5358
Isolation: driver.IsolationLevel(sql.LevelRepeatableRead),
5459
ReadOnly: false,
5560
},
5661
err: true,
5762
},
5863
{
64+
name: xtest.CurrentFileLine(),
5965
txOptions: driver.TxOptions{
6066
Isolation: driver.IsolationLevel(sql.LevelSnapshot),
6167
ReadOnly: false,
6268
},
6369
err: true,
6470
},
6571
{
72+
name: xtest.CurrentFileLine(),
6673
txOptions: driver.TxOptions{
6774
Isolation: driver.IsolationLevel(sql.LevelSerializable),
6875
ReadOnly: false,
6976
},
70-
err: true,
77+
txControl: table.WithSerializableReadWrite(),
78+
err: false,
7179
},
7280
{
81+
name: xtest.CurrentFileLine(),
7382
txOptions: driver.TxOptions{
7483
Isolation: driver.IsolationLevel(sql.LevelLinearizable),
7584
ReadOnly: false,
@@ -79,41 +88,47 @@ func TestToYDB(t *testing.T) {
7988

8089
// read-only
8190
{
91+
name: xtest.CurrentFileLine(),
8292
txOptions: driver.TxOptions{
8393
Isolation: driver.IsolationLevel(sql.LevelDefault),
8494
ReadOnly: true,
8595
},
8696
err: true,
8797
},
8898
{
99+
name: xtest.CurrentFileLine(),
89100
txOptions: driver.TxOptions{
90101
Isolation: driver.IsolationLevel(sql.LevelReadUncommitted),
91102
ReadOnly: true,
92103
},
93104
err: true,
94105
},
95106
{
107+
name: xtest.CurrentFileLine(),
96108
txOptions: driver.TxOptions{
97109
Isolation: driver.IsolationLevel(sql.LevelReadCommitted),
98110
ReadOnly: true,
99111
},
100112
err: true,
101113
},
102114
{
115+
name: xtest.CurrentFileLine(),
103116
txOptions: driver.TxOptions{
104117
Isolation: driver.IsolationLevel(sql.LevelWriteCommitted),
105118
ReadOnly: true,
106119
},
107120
err: true,
108121
},
109122
{
123+
name: xtest.CurrentFileLine(),
110124
txOptions: driver.TxOptions{
111125
Isolation: driver.IsolationLevel(sql.LevelRepeatableRead),
112126
ReadOnly: true,
113127
},
114128
err: true,
115129
},
116130
{
131+
name: xtest.CurrentFileLine(),
117132
txOptions: driver.TxOptions{
118133
Isolation: driver.IsolationLevel(sql.LevelSnapshot),
119134
ReadOnly: true,
@@ -122,27 +137,27 @@ func TestToYDB(t *testing.T) {
122137
err: false,
123138
},
124139
{
140+
name: xtest.CurrentFileLine(),
125141
txOptions: driver.TxOptions{
126142
Isolation: driver.IsolationLevel(sql.LevelSerializable),
127143
ReadOnly: true,
128144
},
129145
err: true,
130146
},
131147
{
148+
name: xtest.CurrentFileLine(),
132149
txOptions: driver.TxOptions{
133150
Isolation: driver.IsolationLevel(sql.LevelLinearizable),
134151
ReadOnly: true,
135152
},
136153
err: true,
137154
},
138155
} {
139-
t.Run(fmt.Sprintf("%+v", tt.txOptions), func(t *testing.T) {
156+
t.Run(tt.name, func(t *testing.T) {
140157
toYDB, err := ToYDB(tt.txOptions)
141158
if !tt.err {
142159
require.NoError(t, err)
143-
if !proto.Equal(table.TxSettings(tt.txControl).Settings(), table.TxSettings(toYDB).Settings()) {
144-
t.Errorf("%+v != %+v", toYDB, tt.txControl)
145-
}
160+
require.Equal(t, table.TxSettings(tt.txControl).Settings(), table.TxSettings(toYDB).Settings())
146161
} else {
147162
require.Error(t, err)
148163
}

0 commit comments

Comments
 (0)