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