我现在对续集的新手我对如何使用续集的交易感到有些困惑。
我的项目启动可以同时调用的事件,这是一个最小化的示例,包含两个事件,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;。
答案 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], 事务:交易})