交易休息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

上一篇: Transaction on rest api

下一篇: in regard to argc (not wondering what it means)