gpt4 book ai didi

javascript - Sequelize js Node 事务

转载 作者:行者123 更新时间:2023-11-30 17:21:32 24 4
gpt4 key购买 nike

我现在是 sequelize 的新手,我对如何使用 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();
}
}
}
});
}

事件A

...
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();
});
});
});
...

事件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();
});
});
});
...

我的问题是,例如第一次出现的事件 A 和 B 被调用,但只有其中一个保留在数据库中 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)
})
})
})

}

关于javascript - Sequelize js Node 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25064698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com