documentation de Knex pour les transactions a du code qui ressemble à ceci:Quand utiliser Knex transiger() vs enchaînant sur l'objet de TRX
knex.transaction(function(trx) {
var books = [
{title: 'Canterbury Tales'},
{title: 'Moby Dick'},
{title: 'Hamlet'}
];
return trx
.insert({name: 'Old Books'}, 'id')
.into('catalogues')
.then(function(ids) {
return Promise.map(books, function(book) {
book.catalogue_id = ids[0];
// Some validation could take place here.
return trx.insert(info).into('books');
});
});
})
Ici, sur SO Je l'ai vu l'utilisation extensive d'une fonction transacting()
avec des exemples que ressembler à ceci:
knex.transaction(function(trx) {
knex('foo')
.transacting(trx)
.insert({id:"bar", username:"bar"})
// etc
})
Knex décrit transacting()
avec des exemples similaires ci-dessus:
Utilisée par knex.transaction, la méthode transacting peut être chaînée à n'importe quelle requête et passer l'objet pour lequel vous souhaitez joindre la requête dans le cadre de la transaction.
Ma question est:
Quelle est la différence entre trx.insert().into('foo')
et knex('foo').transacting(trx).insert()
et pourquoi voudriez-vous utiliser une place de l'autre?
C'est en effet une question de style. Utiliser '.transacting()' est l'ancienne méthode et utiliser 'trx' comme instance de knex est une nouvelle façon. La manière la plus récente a été ajoutée pour rendre plus difficile l'omission de la définition de la transaction pour les requêtes, qui sont assez difficiles à repérer les bogues. Donc, en général, on devrait utiliser 'trx ('table'). Insert (...)' style. –