Sequelize js节点事务

时间:2014-07-31 16:52:47

标签: javascript node.js sequelize.js

我现在对续集的新手我对如何使用续集的交易感到有些困惑。

我的项目启动可以同时调用的事件,这是一个最小化的示例,包含两个事件,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 =&#34; 2&#34;而不是东西=&#34; 12&#34;。

2 个答案:

答案 0 :(得分:1)

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

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)
            })
        })
    })

}

答案 1 :(得分:1)

对于有同样问题的其他人。我最后用行锁定来解决这个问题。

此外,我还没有将交易传递给所有.save().updateAttributtes(),以及我没有正确使用更新属性,这是(至少对于我来说)看到了):

  

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