Skip to content

Commit 05eab3b

Browse files
authored
Merge pull request #18 from ShimmerGlass/rollback-tx
Fix: mariadb: rollback transactions on error
2 parents b4976ad + 8408a03 commit 05eab3b

File tree

3 files changed

+12
-9
lines changed

3 files changed

+12
-9
lines changed

go.mod

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,13 @@ go 1.13
55
require (
66
github.com/abbot/go-http-auth v0.4.0
77
github.com/antlr/antlr4 v0.0.0-20200103163232-691acdc23f1f
8-
github.com/cespare/reflex v0.2.0 // indirect
98
github.com/cheggaaa/pb v2.0.7+incompatible
109
github.com/deckarep/golang-set v1.7.1
1110
github.com/go-sql-driver/mysql v1.5.0
1211
github.com/golang-collections/go-datastructures v0.0.0-20150211160725-59788d5eb259
1312
github.com/gorilla/mux v1.7.3
14-
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
1513
github.com/mattn/go-colorable v0.0.9 // indirect
1614
github.com/mattn/go-isatty v0.0.3 // indirect
17-
github.com/ogier/pflag v0.0.1 // indirect
1815
github.com/spf13/cobra v0.0.5
1916
github.com/spf13/viper v1.6.1
2017
github.com/stretchr/testify v1.3.0

go.sum

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ github.com/antlr/antlr4 v0.0.0-20200103163232-691acdc23f1f/go.mod h1:T7PbCXFs94r
1111
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
1212
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
1313
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
14-
github.com/cespare/reflex v0.2.0 h1:6d9WpWJseKjJvZEevKP7Pk42nPx2+BUTqmhNk8wZPwM=
15-
github.com/cespare/reflex v0.2.0/go.mod h1:ooqOLJ4algvHP/oYvKWfWJ9tFUzCLDk5qkIJduMYrgI=
1614
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
1715
github.com/cheggaaa/pb v2.0.7+incompatible h1:gLKifR1UkZ/kLkda5gC0K6c8g+jU2sINPtBeOiNlMhU=
1816
github.com/cheggaaa/pb v2.0.7+incompatible/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s=
@@ -67,8 +65,6 @@ github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22
6765
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
6866
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
6967
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
70-
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
71-
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
7268
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
7369
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
7470
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@@ -92,8 +88,6 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk
9288
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
9389
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
9490
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
95-
github.com/ogier/pflag v0.0.1 h1:RW6JSWSu/RkSatfcLtogGfFgpim5p7ARQ10ECk5O750=
96-
github.com/ogier/pflag v0.0.1/go.mod h1:zkFki7tvTa0tafRvTBIZTvzYyAu6kQhPZFnshFFPE+g=
9791
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
9892
github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
9993
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=

internal/database/mariadb.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,19 +163,22 @@ func (m *MariaDB) resolveAssets(assets []knowledge.AssetKey, registry *AssetRegi
163163

164164
stmt, err := tx.PrepareContext(context.Background(), "SELECT id FROM assets WHERE type = ? AND value = ?")
165165
if err != nil {
166+
tx.Rollback()
166167
return fmt.Errorf("Unable to prepare statement: %v", err)
167168
}
168169

169170
for _, a := range assets {
170171
q, err := stmt.QueryContext(context.Background(), a.Type, a.Key)
171172
if err != nil {
173+
tx.Rollback()
172174
return fmt.Errorf("Unable to query asset %v: %v", a, err)
173175
}
174176
defer q.Close()
175177

176178
for q.Next() {
177179
var idx int64
178180
if err := q.Scan(&idx); err != nil {
181+
tx.Rollback()
179182
return fmt.Errorf("Unable to retrieve id for %v: %v", a, err)
180183
}
181184
registry.Set(knowledge.AssetKey(a), idx)
@@ -223,10 +226,12 @@ INSERT INTO assets (type, value) VALUES (?, ?)`)
223226

224227
res, err := insertQuery.ExecContext(context.Background(), a.Type, a.Key)
225228
if err != nil {
229+
tx.Rollback()
226230
return 0, fmt.Errorf("Unable to insert asset %v: %v", a, err)
227231
}
228232
idx, err := res.LastInsertId()
229233
if err != nil {
234+
tx.Rollback()
230235
return 0, fmt.Errorf("Unable to retrieve last inserted ID: %v", err)
231236
}
232237
registry.Set(knowledge.AssetKey(a), idx)
@@ -262,6 +267,7 @@ func (m *MariaDB) upsertRelations(source string, relations []knowledge.Relation,
262267
q, err := tx.PrepareContext(context.Background(),
263268
"INSERT INTO relations (from_id, to_id, type, source) VALUES (?, ?, ?, ?)")
264269
if err != nil {
270+
tx.Rollback()
265271
return 0, fmt.Errorf("Unable to prepare relation insertion query: %v", err)
266272
}
267273
defer q.Close()
@@ -286,6 +292,7 @@ func (m *MariaDB) upsertRelations(source string, relations []knowledge.Relation,
286292
bar.Increment()
287293
continue
288294
}
295+
tx.Rollback()
289296
return 0, fmt.Errorf("Unable to insert relation %v (%d -> %d): %v", r, idxFrom, idxTo, err)
290297
}
291298
bar.Increment()
@@ -318,6 +325,7 @@ INNER JOIN assets a ON r.from_id = a.id
318325
INNER JOIN assets b ON r.to_id = b.id
319326
WHERE a.type = ? AND a.value = ? AND b.type = ? AND b.value = ? AND r.type = ? AND r.source = ?`)
320327
if err != nil {
328+
tx.Rollback()
321329
return 0, 0, err
322330
}
323331
defer stmt.Close()
@@ -326,11 +334,13 @@ WHERE a.type = ? AND a.value = ? AND b.type = ? AND b.value = ? AND r.type = ? A
326334
res, err := stmt.ExecContext(context.Background(),
327335
r.From.Type, r.From.Key, r.To.Type, r.To.Key, r.Type, source)
328336
if err != nil {
337+
tx.Rollback()
329338
return 0, 0, fmt.Errorf("Unable to detete relation %v: %v", r, err)
330339
}
331340
bar.Increment()
332341
rCount, err := res.RowsAffected()
333342
if err != nil {
343+
tx.Rollback()
334344
return 0, 0, fmt.Errorf("Unable to count rows affected by relations deletion: %v", err)
335345
}
336346
removedCount += rCount
@@ -342,11 +352,13 @@ DELETE a FROM assets a
342352
WHERE id NOT IN (select from_id from relations)
343353
AND id NOT IN (select to_id from relations)`)
344354
if err != nil {
355+
tx.Rollback()
345356
return 0, 0, fmt.Errorf("Unable to delete assets: %v", err)
346357
}
347358

348359
removedAssetsCount, err := res.RowsAffected()
349360
if err != nil {
361+
tx.Rollback()
350362
return 0, 0, fmt.Errorf("Unable to count rows affected by assets deletion: %v", err)
351363
}
352364

0 commit comments

Comments
 (0)