2012-02-16 18 views
5

私たちは、既存のSQLデータベースを持っている、と私は、まっすぐにSQLを使用してアクセスするのNode.jsサーバーを書いて、このPostgresのドライバモジュールを使用しています:のNode.js + Postgresデータベースのトランザクション管理

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

これまでのところ私はポストグルで動作するトランザクション管理ノードモジュールを見つけることができません。誰か知っていますか?好ましくは、実際の使用では?

第2に、より高いレベルでは、node.jsが実際にJavaを、潜在的にボリュームを処理するサーバーの現実的なソリューションとして置き換えることができるかどうかを評価しています。トランザクション管理は私たちが解決しなければならない課題の1つでした。だから、それについてのいくつかの洞察も役に立つだろう。

現時点では、単にノード・サーバー要求の開始時にSQL BEGINを発行し、最後にROLLBACKまたはCOMMITを発行しています。しかし、私は(おそらく明らかに)SQLトランザクション管理を取り巻く現実の問題に精通していません。誰かがトランザクション管理フレームワークが解決する問題を簡単に説明できれば、私はそれが有用であると思うだろう。

EDIT:私は、postgresドライバのビルトイン接続プーリングメカニズムを使用しています.HTTPリクエスト内のすべてのクエリは、プールから取得した同じ接続で発行されます。最初にBEGINが発行され、次に特定のhttp要求が何であれ、COMMITまたはROLLBACKが発行されます。

ありがとうございました。

答えて

3

トランザクション管理は非常に大きな課題です。あなたがやっていることを想像するには、AUTOCOMMITモードを使いたいと思うでしょう。これは、基本的に、PostgreSQLを使用してすべてのステートメントをBEGIN/COMMITすることになります(つまり、すべてのステートメントは互いに関係なく独自のトランザクションで実行されます)。 AUTOCOMMITモードが適切かどうかを判断する簡単な方法は、ROLLBACKを使用する必要がないと判断することです。 AUTOCOMMITモードの最大の利点は、愚かな接続プーリングツールでさえもねないことです。

トランザクション管理に関するぎりぎりの詳細については、http://www.postgresql.org/docs/9.1/static/transaction-iso.htmlを参照してください。これまでに行ったことは、「トランザクション中のIDLE」の土地に残す素朴なフレームワークを使用したり、書き込んだりしないようにしてください。そして最後に、あなたは "高音量"と言いましたので、あなたの書き込みのバランスがどのようなものかを尋ねるべきです。読取り動作を強く望む場合は、memcachedを使用するコードを書くことを検討する必要があります。これを行う最も簡単な方法(最も効果的ではありません)はPQCです。

+0

ありがとうございます。我々の要求は原子単位である必要があるいくつかの更新ステートメントを発行するので、我々はROLLBACKが必要です。私はその文書とPQCを見ていきます。 – Jake

3

pg-promiseライブラリがうまくトランザクション管理の面倒を見る:

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

パスで:Sequelize http://docs.sequelizejs.com/en/latest/api/transaction/

レベルは、使用する可能性アイソレーショントランザクションを開始するための

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

+0

@Derek [構成可能なトランザクション](https://github.com/vitaly-t/pg-promise#configurable-transactions) –

+0

驚くべきライブラリvitaly-tをありがとう! – Derek

0

ルック第1引数として所望のレベル:

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. 
}); 
関連する問題