交易休息api
我正在开发一个项目,我需要使用Nodejs实现事务以回滚PostgreSQL数据库durin REST操作。 我已经分别为GET,PUT和POST方法实现了事务。 我需要使用交易一次还是我在正确的轨道上? 在此先感谢您的帮助。
如果需要,我想确保数据库回滚数据。 我正在使用pg-promise库来获取结果。
db.tx(t => {
return t.batch([
t.query('UPDATE users SET active = $1 WHERE id = $2', [true, 123]),
t.query('INSERT INTO audit(event, id) VALUES($1, $2)', ['activate', 123])
]);
})
.then(data => {
// success;
})
.catch(error => {
// error;
});
或者,我是否应该在下面实施方法?
module.exports = {
// if you can run all migration queries simultaneously
up: ({ sequelize: db }) => db.transaction(transaction => Promise.all([
db.query('...', { transaction }),
db.query('...', { transaction }),
])),
// If you have to wait for every query before executing next one
down: ({ sequelize: db }) => db.transaction(async (transaction) => {
await db.query('...', { transaction });
await db.query('...', { transaction });
}),
};
先谢谢你。
我建议您使用Bookshelf,它是一个运行在Knex查询构建器上的非常成熟的ORM。 书架提供了一个事务API,当代码中的任何“拒绝”被调用时,它将会回滚。 例如:
const knex = require('knex')({
client: 'pg',
connection: {
host: '127.0.0.1',
user: 'user',
password: 'password',
database: 'db',
charset: 'utf8'
}
});
const bookshelf = require('bookshelf')(knex);
const User = bookshelf.Model.extend({
tableName: 'users'
});
const deleteUsers = ids =>
bookshelf.transaction(transacting =>
Promise.map(ids, id => User.forge({ id })
.fetch({ transacting })
.then((user) => {
if (!user) return Promise.reject(new Error('User not found (this is a rollback)'));
return user.destroy({ transacting }); // If something wrong happens here, a rollback is called
})))
.then(() => Promise.resolve('Transaction Complete! (this is a commit)'));
在这里我只是做了一个接收一个ids
数组的deleteUsers()
函数,然后开始一个事务开始寻找用户然后删除它们。 如果没有找到任何用户或者其中一个DELETE操作失败,则会出现回滚。
Sequelizejs的文档显示您的第一个方法是确定的。 我会为了更好的控制而争取第二名。 Rest,nodejs - 这意味着微服务。 即使没有 - 我觉得每个请求的单个事务处理都是正确的。
如果你需要更好地控制“工作单位”的含义,那么,也许我会把它们作为单独的交易。 这会给数据库带来额外的负担,所以如果不需要的话,我不会这么做。
看起来像所有代码示例都是有效的。
据我了解,事务中的所有操作必须使用相同的连接执行,
因此,即使您不会等到第一个请求结束时,第二个请求也不会在第一个请求完成之前开始(在库级别上,因为它们使用相同的连接,并且连接只能处理parralel中的一个请求)
所以不要担心...
为了更快执行,您可以打开多个连接并平行地完成多个事务
链接地址: http://www.djcxy.com/p/40587.html