续集js节点事务
我现在是新来的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(); } } } }); }
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 =“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) }) }) }) }
只是对有同样问题的其他人。 我结束了解决这个行locking。
此外,我没有把事务传递给所有的.save()
和.updateAttributtes()
,以及我没有正确使用更新属性,这是(至less对于我所看到的):
updateAttributes({fieldName:newFieldValue},{fields:[fieldName],transaction:transaction})
- 从babel-preset-env中删除全局“use strict”
- 如何在node.js后端得到昨天的date?
- NodeJs:取消函数调用,如果它太长
- PHP websocket连接到node.js服务器
- 同时键盘input(对angular线游戏移动)
- 关于用MEAN Stack创build多租户SAAS应用程序的build议(Mongodb,express,angular,node)
- 如何使用AWS Cognito SDK使用NodeJS从REST服务authentication用户?
- Javascript是同步(阻塞)还是asynchronous(非阻塞)默认情况下
- 如何忽略自签名证书错误node.js soap.js