.transaction()
sails-mysql または sails-postgresql アダプター(およびそれに伴う適切なドライバ)に接続された、事前に設定された遅延オブジェクトを取得します。
await datastore.transaction(during);
または
var result = await datastore.transaction(during);
引数 | 型 | 詳細 | |
---|---|---|---|
1 | during | 下記の「during の使用方法」表のパラメーターを参照してください。 |
引数 | 型 | 詳細 | |
---|---|---|---|
1 | db | リースされた(トランザクション型の)データベース接続です。(これに関する詳細は、.usingConnection() を参照してください。) |
Sails 1.1.0 より前では、
.transaction()
の推奨される使用方法として、「during」コードが完了時にコールバック(proceed
)を呼び出すことが期待されていました。 「during」コードの関数シグネチャに2番目の引数を実際に含めない限り、これはもはや必要ありません。
型 | 詳細 |
---|---|
during から返されたオプションの結果データです。つまり、during 関数内で `return 'foo';` を実行した場合、これは `'foo'` になります。 |
名前 | 型 | 発生時 |
---|---|---|
UsageError | 無効な値が渡された場合にスローされます。 | |
AdapterError | データベースアダプターで問題が発生した場合にスローされます。 | |
Error | 予期しないことが発生した場合にスローされます。 |
Sails と Waterline でのエラー処理の例については、概念 > モデルと ORM > エラー を参照してください。
指定された金額をユーザーの一方の残高から差し引き、もう一方の残高に加算します。
// e.g. in an action:
var flaverr = require('flaverr');
await sails.getDatastore()
.transaction(async (db)=> {
var myAccount = await BankAccount.findOne({ owner: this.req.session.userId })
.usingConnection(db);
if (!myAccount) {
throw new Error('Consistency violation: Database is corrupted-- logged in user record has gone missing');
}
var recipientAccount = await BankAccount.findOne({ owner: inputs.recipientId }).usingConnection(db)
if (!recipientAccount) {
throw flaverr('E_NO_SUCH_RECIPIENT', new Error('There is no recipient with that id'));
}
// Do the math to subtract from the logged-in user's account balance,
// and add to the recipient's bank account balance.
var myNewBalance = myAccount.balance - inputs.amount;
// If this would put the logged-in user's account balance below zero,
// then abort. (The transaction will be rolled back automatically.)
if (myNewBalance < 0) {
throw flaverr('E_INSUFFICIENT_FUNDS', new Error('Insufficient funds'));
}
// Update the current user's bank account
await BankAccount.update({ owner: this.req.session.userId })
.set({
balance: myNewBalance
})
.usingConnection(db);
// Update the recipient's bank account
await BankAccount.update({ owner: inputs.recipientId })
.set({
balance: recipientAccount.balance + inputs.amount
})
.usingConnection(db);
})
.intercept('E_INSUFFICIENT_FUNDS', ()=>'badRequest')
.intercept('E_NO_SUCH_RECIPIENT', ()=>'notFound');
上記の例は単なるデモンストレーションであることに注意してください。実際には、この種の増減ロジックには行レベルのロックも含まれている必要があります。不明な点があれば?.