.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”代码的函数签名中不实际包含第二个参数,这就不再需要了。
类型 | 详情 |
---|---|
从 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');
请注意,以上示例仅供演示;在实践中,此类增量/减量逻辑还应包括行级锁定。 不确定?。