2012-02-16 107 views
5

我们现有的SQL数据库,我正在写使用直接的SQL访问它的node.js服务器,使用这种Postgres的驱动模块:的node.js + Postgres数据库事务管理

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

到目前为止,我找不到一个与postgres一起工作的事务管理节点模块。有人知道吗?最好有一些现实世界的使用?

其次,在更高层次上,我们正在评估node.js是否实际上可以将Java替换为可能处理卷的服务器的真实解决方案。交易管理是我们必须解决的问题之一。所以对此的一些洞察也是有用的。

目前,我只是在节点服务器请求的开始处发出sql BEGIN,并在结尾处发出ROLLBACK或COMMIT。但是,我(或许显然)不熟悉与SQL事务管理有关的现实世界问题。如果有人可以简要地解释事务管理框架解决的问题,我会发现它很有用。

编辑:我正在使用postgres驱动程序的内置连接池机制,并且在http请求内的所有查询都是从池中获取的同一连接上发出的。首先发布BEGIN,然后无论具体的http请求如何,然后执行COMMIT或ROLLBACK。

谢谢。

回答

3

交易管理是一个相当大的主题。对于我想象中的你所做的,你会想使用AUTOCOMMIT模式。这基本上意味着您将依赖PostgreSQL来开始/提交所有的语句(或者换句话说,您的所有语句将在他们自己的事务中运行,而彼此之间没有任何关系)。确定AUTOCOMMIT模式适合您的一种简单方法是决定不需要使用ROLLBACK。 AUTOCOMMIT模式的一个巨大好处是,即使是最愚蠢的连接池工具也不能搞砸。

关于事务管理的细节,请先看看http://www.postgresql.org/docs/9.1/static/transaction-iso.html你做了什么,确保你没有使用或编写一个幼稚的框架,让你在“IDLE交易”的土地。最后,既然你提到了“高容量”,我应该问一下你的读写平衡是什么。如果它强烈支持读取行为,那么您应该考虑编写代码来使用memcached。最简单的(但最有效的)方法是使用PQC

+0

感谢您的所有信息。我们确实需要ROLLBACK,因为我们的请求发出了一些需要成为原子单元的更新语句。我会看看那份文件和PQC。 – Jake 2012-04-18 15:35:42

3

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; 
    }); 
+0

你知道如何使用这种方法设置交易级别吗? – Derek 2015-12-09 04:25:45

+0

@Derek请参阅[可配置交易](https://github.com/vitaly-t/pg-promise#configurable-transactions) – 2015-12-09 09:02:50

+0

感谢您的惊人库重要! – Derek 2015-12-10 05:40:09

0

查找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. 
});