私の問題は、クエリの複雑なチェーンがあり、このトランザクションの誰かが失敗するとロールバックすることです。Sails のトランザクションについて読んだことがありますが、デフォルトでは、各トランザクションが Postgres との新しい接続を作成するため、Sails はトランザクションをサポートしていないため、1 つのクエリで新しい接続が行われます。では、Sails でトランザクションを使用するにはどうすればよいでしょうか?
2 に答える
現在、トランザクションはウォーターラインではサポートされていません。https://github.com/balderdashy/waterline/issues/755でディスカッションに参加できます。
トランザクションはロードマップにありますが、近い将来には予定されていません: https://github.com/balderdashy/waterline/blob/master/ROADMAP.md#pending-proposals
回避策としてhttps://github.com/Shyp/pg-transactionsを試すこともできますが、コードがデータベースに依存しなくなるため、ウォーターラインの柔軟性が失われます。
また、プロミス (Postgres)とSails.js + Postgres でトランザクションを使用する場合の Sails.js のベスト プラクティス: トランザクションの問題を確認してください。
最も簡単な方法は、 pg-promiseでサポートされている自動トランザクションを使用することです。
db.tx(t=> {
// - returning a value or a resolved promise will result in COMMIT
// - returning a resolved promise or throwing an error will result in ROLLBACK
})
.then(data=> {
// COMMIT has been executed
// data = data returned from the callback
})
.catch(error=> {
// ROLLBACK has been executed
// error = rejection reason or error thrown
});
ただし、@zabware が言ったように、Waterline ではなく、クエリを直接実行する必要があります。
コードがデータベースに依存しなくなるため、ウォーターラインの柔軟性が失われます。
参照:取引