@@ -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