交易restAPI

我正在一个项目,我需要实现事务回滚PostgreSQL数据库durin REST操作使用Nodejs。 我已经分别为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 }); }), }; 

先谢谢你。

我build议你使用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()函数,然后启动一个事务开始寻找用户然后删除它们。 如果没有find任何用户或者其中一个DELETE操作失败,则会有回滚。

Sequelizejs的文档显示你的第一个方法是OK的。 我会为了更好的控制第二。 Rest,nodejs – 这意味着微服务。 即使不是,我觉得每个请求的单个事务是正确的。

如果你需要更好地控制“工作单位”这个东西,那么也许我会把它们作为单独的交易。 这会给数据库带来额外的负载,所以如果不需要的话,我不会这么做。

看起来像所有的代码示例是有效的。

据我所知,事务中的所有操作必须使用相同的连接来执行,

因此,即使您不会等到第一个请求结束,第二个请求在第一个请求完成之前也不会启动(在库级别,因为它们使用相同的连接,连接只能处理parralel中的一个请求)

所以不要担心

为了更快的执行,你可以打开几个连接并且平行地完成几个事务