node.js + postgres数据库事务pipe理

我们有一个现有的SQL数据库,并且正在使用这个postgres驱动程序模块编写一个使用直接SQL访问它的node.js服务器:

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

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

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

目前,我只是在节点服务器请求的开始处发出一个sql BEGIN,最后是一个ROLLBACK或COMMIT。 但是,我(或许显然)不熟悉与SQL事务pipe理有关的现实世界问题。 如果有人能简单地解释事务pipe理框架解决的问题,我会觉得它很有用。

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

谢谢。

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

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

pg-promise库很好地处理了事务pipe理:

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

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