Node-Postgres: объединить операторы транзакций в один, чтобы повысить скорость? - PullRequest
0 голосов
/ 31 августа 2018

В настоящее время я использую node-postgres до INSERT и UPDATE много данных для моего PostgresDB. Транзакции могут содержать до 15 000 операторов.

Я использую транзакции, как указано в документации :

client.query('BEGIN', (err) => {
if (shouldAbort(err)) return
client.query('INSERT INTO users(name) VALUES($1) RETURNING id', ['brianc'], (err, res) => {
  if (shouldAbort(err)) return

  const insertPhotoText = 'INSERT INTO photos(user_id, photo_url) VALUES ($1, $2)'
  const insertPhotoValues = [res.rows[0].id, 's3.bucket.foo']
  client.query(insertPhotoText, insertPhotoValues, (err, res) => {
    if (shouldAbort(err)) return

    client.query('COMMIT', (err) => {
      if (err) {
        console.error('Error committing transaction', err.stack)
      }
      done()
    })
  })
})

Проблема , однако, заключается в том, что каждый оператор транзакции отправляется в БД индивидуально, что имеет смысл в примере, но в нашем случае использования нам никогда не понадобится получать результат из предыдущего оператора.

Поэтому у меня возникает соблазн собрать все операторы в одно и выполнить их одновременно, чтобы сократить общую продолжительность транзакции.

Было бы интересно узнать, может ли это вызвать нежелательное поведение. Спасибо!

1 Ответ

0 голосов
/ 03 сентября 2018

Разрешил сам. При вводе нескольких команд в операторе запрос не выполняется: «Ошибка: невозможно вставить несколько команд в подготовленный оператор»

...