序列化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的东西= "2"而不是东西= "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)
            })
        })
    })
}

只是给那些有同样问题的人。我最终用行锁定解决了这个问题。

我也没有将事务传递给所有.save().updateAttributtes(),以及我没有正确使用更新属性,那就是(至少对于我所看到的):

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

最新更新