1 // TODO: import from ES6 when retry typing file will include errorFilter function
2 import retry = require('async/retry')
4 const db = require('../initializers/database')
5 import { logger } from './logger'
7 function commitTransaction (t, callback) {
8 return t.commit().asCallback(callback)
11 function rollbackTransaction (err, t, callback) {
12 // Try to rollback transaction
14 // Do not catch err, report the original one
15 t.rollback().asCallback(function () {
23 // { arguments, errorMessage }
24 function retryTransactionWrapper (functionToRetry, options, finalCallback) {
25 const args = options.arguments ? options.arguments : []
29 return functionToRetry.apply(this, args.concat([ callback ]))
33 logger.error(options.errorMessage, { error: err })
36 // Do not return the error, continue the process
37 return finalCallback(null)
42 function transactionRetryer (func, callback) {
46 errorFilter: function (err) {
47 const willRetry = (err.name === 'SequelizeDatabaseError')
48 logger.debug('Maybe retrying the transaction function.', { willRetry })
54 function startSerializableTransaction (callback) {
55 db.sequelize.transaction({ isolationLevel: 'SERIALIZABLE' }).asCallback(function (err, t) {
56 // We force to return only two parameters
57 return callback(err, t)
61 // ---------------------------------------------------------------------------
65 retryTransactionWrapper,
67 startSerializableTransaction,