Javascript 续集js节点事务

Javascript 续集js节点事务,javascript,node.js,sequelize.js,Javascript,Node.js,Sequelize.js,我现在是sequelize新手,我有点困惑如何使用sequelize的事务 我的项目启动可以同时调用的事件,这里是一个最小化的示例,包含两个事件,eventA或eventB,以及一个最小化的模型用户 var Sequelize=需要(“Sequelize”) 事件 ... sequelize.transaction(function(transaction) { User.sync().success(function(err, restuls){

我现在是sequelize新手,我有点困惑如何使用sequelize的事务

我的项目启动可以同时调用的事件,这里是一个最小化的示例,包含两个事件,eventA或eventB,以及一个最小化的模型用户

var Sequelize=需要(“Sequelize”)

事件

...
    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();
            });     
        });
    });
...
。。。
sequelize.transaction(函数(事务){
User.sync().success(函数(err,restuls){
User.getAllUsers(函数(错误、结果){
对于(var i=0;i
事件B

    ....
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();
            });     
        });
});
...
。。。。
sequelize.transaction(函数(事务){
User.sync().success(函数(err,restuls){
User.getAllUsers(函数(错误、结果){
对于(var i=0;i

我的问题是,例如,调用了第一次出现的事件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)
            })
        })
    })

}

只是对其他有同样问题的人。我最终通过一个行锁定解决了这个问题

此外,我没有将事务传递给所有
.save()
.updateAttributes()
,并且没有正确使用更新属性,即(至少就我所看到的情况而言):

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


虽然这清理了我的代码,但我也有同样的问题。当同时调用这些事件时,它们将获得相同的信息,当它们更新属性时,它们将忽略两个事务打开的事务。
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)
            })
        })
    })

}