Skip to content

Commit e4ab8cf

Browse files
committed
Merge remote-tracking branch 'origin/main'
2 parents cd4fefa + 9b8e3f1 commit e4ab8cf

File tree

1 file changed

+33
-17
lines changed

1 file changed

+33
-17
lines changed

metadata/product/mysql/sequence/transient.go

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@ import (
44
"context"
55
"database/sql"
66
"fmt"
7+
"strconv"
8+
79
"github.com/viant/sqlx/io"
810
"github.com/viant/sqlx/metadata"
911
"github.com/viant/sqlx/metadata/info"
1012
"github.com/viant/sqlx/metadata/info/dialect"
1113
"github.com/viant/sqlx/metadata/sink"
1214
"github.com/viant/sqlx/option"
13-
"strconv"
1415
)
1516

1617
// Transient represents struct used to setting new autoincrement value
@@ -60,32 +61,47 @@ func (n *Transient) Handle(ctx context.Context, db *sql.DB, target interface{},
6061
sequence.Catalog = arguments[0].(string)
6162
sequence.Schema = arguments[1].(string)
6263
sequence.Name = arguments[2].(string)
63-
err = updateSequence(ctx, db, &sequence, tx)
64-
65-
if err != nil {
66-
return false, err
67-
}
6864

6965
sequenceSQLBuilder := options.SequenceSQLBuilder()
7066
if sequenceSQLBuilder == nil {
7167
return false, fmt.Errorf("SequenceSQLBuilder was empty")
7268
}
7369

74-
transientDML, err := sequenceSQLBuilder(&sequence)
75-
if err != nil {
76-
return false, err
77-
}
78-
if transientDML == nil {
79-
return false, fmt.Errorf("transientDML was empty")
70+
retryMaxCnt := 3
71+
72+
for i := 1; i <= retryMaxCnt; i++ {
73+
err = updateSequence(ctx, db, &sequence, tx)
74+
if err != nil {
75+
return false, err
76+
}
77+
78+
transientDML, err := sequenceSQLBuilder(&sequence)
79+
if err != nil {
80+
return false, err
81+
}
82+
if transientDML == nil {
83+
return false, fmt.Errorf("transientDML was empty")
84+
}
85+
86+
_ = n.turnFkKeyCheck(tx, 0)
87+
_, err = tx.ExecContext(ctx, transientDML.Query, transientDML.Args...)
88+
_ = n.turnFkKeyCheck(tx, 1)
89+
90+
if err != nil && i < retryMaxCnt {
91+
continue
92+
}
93+
94+
if err != nil { //temp workaround of cascading sequencer
95+
err = fmt.Errorf("unable to get sequence values (attempt %d) using transient dml %v due to: %w", i, transientDML, err)
96+
}
97+
98+
break
8099
}
81100

82-
_ = n.turnFkKeyCheck(tx, 0)
83-
_, err = tx.ExecContext(ctx, transientDML.Query, transientDML.Args...)
84-
_ = n.turnFkKeyCheck(tx, 1)
85-
if err != nil { //temp workaround of cascading sequencer
86-
err = fmt.Errorf("unable to get sequence values using transient dml %v due to: %w", transientDML, err)
101+
if err != nil {
87102
return false, err
88103
}
104+
89105
*targetSequence = sequence
90106
return false, nil
91107
}

0 commit comments

Comments
 (0)