3 const retry
= require('async/retry')
5 const db
= require('../initializers/database')
6 const logger
= require('./logger')
10 retryTransactionWrapper
,
12 startSerializableTransaction
,
16 function commitTransaction (t
, callback
) {
17 return t
.commit().asCallback(callback
)
20 function rollbackTransaction (err
, t
, callback
) {
21 // Try to rollback transaction
23 // Do not catch err, report the original one
24 t
.rollback().asCallback(function () {
32 // { arguments, errorMessage }
33 function retryTransactionWrapper (functionToRetry
, options
, finalCallback
) {
34 const args
= options
.arguments
? options
.arguments : []
36 utils
.transactionRetryer(
38 return functionToRetry
.apply(this, args
.concat([ callback
]))
42 logger
.error(options
.errorMessage
, { error: err
})
45 // Do not return the error, continue the process
46 return finalCallback(null)
51 function transactionRetryer (func
, callback
) {
55 errorFilter: function (err
) {
56 const willRetry
= (err
.name
=== 'SequelizeDatabaseError')
57 logger
.debug('Maybe retrying the transaction function.', { willRetry
})
63 function startSerializableTransaction (callback
) {
64 db
.sequelize
.transaction({ isolationLevel: 'SERIALIZABLE' }).asCallback(function (err
, t
) {
65 // We force to return only two parameters
66 return callback(err
, t
)
70 // ---------------------------------------------------------------------------
72 module
.exports
= utils