续集js节点事务

我现在是新来的sequelize现在我有点困惑如何使用续集的交易。

我的项目启动可以同时调用的事件,这里是一个最小化的例子,有两个事件eventA或eventB和一个最小化的模型User。

var Sequelize = require('sequelize');

module.exports = function(sequelize, DataTypes) { return sequelize.define('Uer', { stuff: { type: Sequelize.STRING, defaultValue: "" } }, { classMethods: { getAllUsers : function (resultsCallback) { this.findAll().complete(function(err, users) { resultsCallback(err, users); }) } }, instanceMethods: { update1: function (transaction) { var stuff = this.stuff + "1"; this.updateUserAttributes(document, transaction, function(err, results){ }); }, update2: function (transaction) { var stuff = this.stuff + "2"; var document = {}; document.stuff = stuff; this.updateUserAttributes(document, transaction, function(err, results){ }); }, updateUserAttributes : function(document, transaction, resultsCallback) { var docArray = []; var call = _.after(Object.keys(document).length, function(){ this .updateAttributes(document, docArray, { transaction: transaction }) .complete(function(err, results) { if (!!err) { console.log('An error occurred while updating', err) } else if (!results) { console.log('Failed to update User.') } resultsCallback(err, results); }); }.bind(this)); for(var key in document){ docArray.push(String(key)); call(); } } } }); } 

eventA

 ... sequelize.transaction(function(transaction) { User.sync().success(function(err, restuls){ User.getAllUsers(function(err, results){ for (var i = 0; i < results.length; i++){ results[i].update1(transaction) } transaction.commit(); }); }); }); ... 

eventB

  .... sequelize.transaction(function(transaction) { User.sync().success(function(err, restuls){ User.getAllUsers(function(err, results){ for (var i = 0; i < results.length; i++){ results[i].update2(transaction) } transaction.commit(); }); }); }); ... 

我的问题是,例如事件A和B的第一次出现被调用,但是只有其中一个保留在DB sutff =“2”而不是stuff =“12”中。

这是我的实现,并在任何地方使用这种方法。

 function trans(callback, done) { sequelize.transaction(function (t) { function commit(callback) { t.commit().done(function (err) { console.log('commited') if (callback) callback(err) }) } function rollback(rollbackErr, callback) { t.rollback().done(function (err) { if (callback) callback(err || rollbackErr) }) } t.done(function () { if (done) done() }) callback(commit, rollback, t) }) } function someExecution(data, callback){ trans(function(commit, rollback, t){ Model.create(data, {transaction: t}).done(function(err, obj){ if (err) return rollback(err, callback) Model.findAll({where: {some: 1}}, {transaction: t}).done(function(err, list){ if (err) return rollback(err, callback) commit(callback) }) }) }) } 

只是对有同样问题的其他人。 我结束了解决这个行locking。

此外,我没有把事务传递给所有的.save().updateAttributtes() ,以及我没有正确使用更新属性,这是(至less对于我所看到的):

updateAttributes({fieldName:newFieldValue},{fields:[fieldName],transaction:transaction})