2012-02-16 112 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. 
});