Javascript 续集js节点事务
我现在是sequelize新手,我有点困惑如何使用sequelize的事务 我的项目启动可以同时调用的事件,这里是一个最小化的示例,包含两个事件,eventA或eventB,以及一个最小化的模型用户 var Sequelize=需要(“Sequelize”) 事件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.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)
})
})
})
}