node.js + postgres управление транзакциями в базе данных - PullRequest
5 голосов
/ 17 февраля 2012

У нас есть существующая база данных SQL, и я пишу сервер node.js, который обращается к ней с использованием прямого SQL, используя этот модуль драйвера postgres:

https://github.com/brianc/node-postgres

Пока чтоЯ не могу найти модуль узла управления транзакциями, который работает с postgres.Кто-нибудь знает об этом?Желательно с некоторым реальным использованием?

Во-вторых, на более высоком уровне мы оцениваем, может ли node.js фактически заменить Java как реальное решение для сервера, потенциально обрабатывающего том.Управление транзакциями было одной из проблем, которую нам нужно было решить.Поэтому некоторое понимание этого также было бы полезно.

На данный момент я просто запускаю sql BEGIN в начале запроса сервера узла и ROLLBACK или COMMIT в конце.Однако я (возможно, очевидно) не знаком с реальными проблемами, связанными с управлением транзакциями SQL.Если бы кто-то мог кратко объяснить проблемы, которые решают структуры управления транзакциями, я нашел бы это полезным.

РЕДАКТИРОВАТЬ: я использую встроенный механизм пула соединений драйвера postgres, и все запросы в пределахHTTP-запрос выдается для того же соединения, полученного из пула.Сначала выдается BEGIN, затем, что бы ни делал конкретный http-запрос, затем COMMIT или ROLLBACK.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 11 апреля 2015

pg-обещание библиотека прекрасно заботится об управлении транзакциями:

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;
    });
3 голосов
/ 25 февраля 2012

Управление транзакциями - довольно большая тема. Для того, что я предполагаю, что вы делаете, вы захотите использовать режим AUTOCOMMIT. По сути, это означает, что вы будете полагаться на PostgreSQL, чтобы НАЧАТЬ / УСТАНОВИТЬ все ваши операторы (или, другими словами, все ваши операторы будут выполняться в своей собственной транзакции, не связанной друг с другом). Простой способ определить, что режим AUTOCOMMIT подходит вам, - это решить, что вам не нужно использовать ROLLBACK. Огромным преимуществом режима AUTOCOMMIT является то, что даже самый глупый инструмент для объединения подключений не может испортить.

Для получения подробной информации об управлении транзакциями, начните с рассмотрения http://www.postgresql.org/docs/9.1/static/transaction-iso.html Что бы вы ни делали, убедитесь, что вы не используете или не пишете наивный фреймворк, который оставляет вас на земле "IDLE в транзакции" , И, наконец, поскольку вы упомянули «большой объем», я должен спросить, каков ваш баланс операций чтения и записи. Если это сильно благоприятствует поведению при чтении, то вам следует подумать о написании кода для использования memcached. Самый простой (но далеко не самый эффективный) способ сделать это - использовать PQC .

0 голосов
/ 04 сентября 2015

Ищите Sequelize http://docs.sequelizejs.com/en/latest/api/transaction/

Возможные уровни изоляции для использования при запуске транзакции:

{
  READ_UNCOMMITTED: "READ UNCOMMITTED",
  READ_COMMITTED: "READ COMMITTED",
  REPEATABLE_READ: "REPEATABLE READ",
  SERIALIZABLE: "SERIALIZABLE"
}

В качестве первого аргумента укажите желаемый уровень:

return sequelize.transaction({
  isolationLevel: Sequelize.Transaction.SERIALIZABLE
}, function (t) {

 // your transactions

}).then(function(result) {
  // transaction has been committed. Do something after the commit if required.
}).catch(function(err) {
  // do something with the err.
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...