Transazioni dichiarative in Node.js

4

Nel passato, era normale gestire le transazioni del database in Java scrivendo il codice che lo faceva. Qualcosa del genere:

Transaction tx = session.startTransaction();
...
try {
   tx.commit();
} catch (SomeException e){
   tx.rollback();
}

all'inizio e alla fine di ogni metodo. Ciò ha alcuni problemi ovvi: è ridondante, nasconde l'intento di ciò che sta accadendo, ecc. Quindi, sono arrivate le transazioni guidate dalle annotazioni:

@Transaction
public SomeResultObj getResult(...){

    ...
}

Esiste un supporto per la gestione dichiarativa delle transazioni in node.js?

    
posta James Kingsbery 06.06.2014 - 20:50
fonte

1 risposta

2

Nel caso tu stia utilizzando Express + Sequelize, puoi farlo utilizzando un modulo chiamato continuation-local-storage (d'ora in poi cls , per brevità).

Mostrami il codice

// When initializing your Sequelize instance
var Sequelize = require( "sequelize" );
Sequelize.cls = require( "continuation-local-storage" ).createNamespace( "db" );

module.exports = new Sequelize(...);

Quindi, crea qualche middleware per inizializzare la tua transazione in ogni richiesta (nel caso nessuno ne abbia ancora trovata una):

var sequelize = require(...);
app.use(function ( req, res, next ) {
  sequelize.transaction(function () {
    // Do something else, but be sure to invoke next middleware
    next();    
  });
});

Che sta succedendo qui?

  1. Viene dichiarato uno spazio dei nomi cls per Sequelize da utilizzare. Deve essere impostato sul costruttore;
  2. Una transazione viene inizializzata in un middleware Express;
  3. Ogni query sequelize successiva utilizzerà la transazione richiesta per impostazione predefinita (è possibile sovrascrivere questo comportamento, ovviamente).

Come funziona?

Funziona perché cls assegna un nuovo spazio di archiviazione per ogni nuova catena asincrona (la richiesta in questo esempio) e vengono trasmessi in modo coerente e trasparente.
È una specie di magia che accade all'interno del nodo:)

Consigli

È molto probabile che dovrai utilizzare alcuni monkeypatch per adottare tale approccio. Dipende dall'implementazione di Promises.

Ulteriori informazioni

Controlla la documentazione di Sequelize .

    
risposta data 20.08.2015 - 14:04
fonte

Leggi altre domande sui tag