3 const retry = require('async/retry')
5 const db = require('../initializers/database')
6 const logger = require('./logger')
9 retryTransactionWrapper,
11 startSerializableTransaction
14 // { arguments, errorMessage }
15 function retryTransactionWrapper (functionToRetry, options, finalCallback) {
16 const args = options.arguments ? options.arguments : []
18 utils.transactionRetryer(
20 return functionToRetry.apply(this, args.concat([ callback ]))
24 logger.error(options.errorMessage, { error: err })
27 // Do not return the error, continue the process
28 return finalCallback(null)
33 function transactionRetryer (func, callback) {
37 errorFilter: function (err) {
38 const willRetry = (err.name === 'SequelizeDatabaseError')
39 logger.debug('Maybe retrying the transaction function.', { willRetry })
45 function startSerializableTransaction (callback) {
47 db.sequelize.transaction({ isolationLevel: 'SERIALIZABLE' }).asCallback(function (err, t) {
48 // We force to return only two parameters
49 return callback(err, t)
53 // ---------------------------------------------------------------------------
55 module.exports = utils