2012-02-16 32 views
5

Tenemos una base de datos SQL existente, y estoy escribiendo un servidor Node.js que accede a ella mediante SQL directamente, usando este módulo controlador postgres:Node.js postgres + gestión de transacciones de base de datos

https://github.com/brianc/node-postgres

Hasta el momento no puedo encontrar un módulo de nodo de gestión de transacciones que funcione con postgres. ¿Alguien sabe de uno? Preferiblemente con un poco de uso en el mundo real?

En segundo lugar, en un nivel superior, estamos evaluando si node.js realmente puede reemplazar a Java como una solución del mundo real para un servidor que potencialmente maneja el volumen. La gestión de transacciones era uno de los problemas que tendríamos que resolver. Entonces, una idea de eso también sería útil.

Por el momento, simplemente estoy emitiendo un sql BEGIN al comienzo de una solicitud de servidor de nodo y un ROLLBACK o COMMIT al final. Sin embargo, estoy (tal vez obviamente) desconocido con los problemas del mundo real que rodean la gestión de transacciones SQL. Si alguien pudiera explicar brevemente los problemas que resuelven los marcos de gestión de transacciones, lo encontraría útil.

EDITAR: Estoy utilizando el mecanismo de agrupación de conexiones integrado del controlador postgres, y todas las consultas dentro de una solicitud http se emiten en la misma conexión obtenida del grupo. Primero se emite BEGIN, luego cualquiera que sea la solicitud http específica, luego COMMIT o ROLLBACK.

Gracias.

Respuesta

3

La gestión de transacciones es un tema bastante amplio. Por lo que imagino que estás haciendo, querrás usar el modo AUTOCOMMIT. Esto básicamente significa que confiará en PostgreSQL para COMENZAR/COMPROMETER todas sus declaraciones (o en otras palabras, que todas sus declaraciones se ejecutarán en su propia transacción sin relación entre ellas). Una manera fácil de decidir que el modo AUTOCOMMIT es adecuado para usted es decidir que no necesita usar ROLLBACK. Una gran ventaja del modo AUTOCOMMIT es que incluso la herramienta de agrupación de conexiones más estúpida no puede arruinarse.

Para conocer los detalles acerca de la gestión de transacciones, comience por echar un vistazo a http://www.postgresql.org/docs/9.1/static/transaction-iso.html Haga lo que haga, asegúrese de no utilizar o escribir un marco ingenuo que lo deje en un terreno "IDLE in transaction". Y, por último, ya que mencionó "alto volumen", debería preguntar cuál es su saldo de lecturas para escribir. Si está favoreciendo fuertemente el comportamiento de lectura, entonces debería considerar escribir su código para usar memcached. La manera más fácil (pero lejos de la más efectiva) de hacer esto es usar PQC. biblioteca

+0

Gracias por la información. Necesitamos ROLLBACK, porque nuestras solicitudes emiten una serie de declaraciones de actualización que deben ser una unidad atómica. Veré ese documento y PQC. – Jake

3

pg-promise se encarga de la gestión de transacciones muy bien:

db.tx(t => { 
     return t.batch([ 
      t.query('UPDATE users SET active = $1 WHERE id = $2', [true, 123]), 
      t.query('INSERT INTO audit(event, id) VALUES($1, $2)', ['activate', 123]) 
     ]); 
    }) 
    .then(data => { 
     // success; 
    }) 
    .catch(error => { 
     // error; 
    }); 
+0

¿sabes cómo establecer el nivel de transacción con este método? – Derek

+0

@Derek Ver [Transacciones configurables] (https://github.com/vitaly-t/pg-promise#configurable-transactions) –

+0

Gracias por la increíble biblioteca vitaly-t !!! – Derek

0

Busque Sequelize http://docs.sequelizejs.com/en/latest/api/transaction/

Los niveles posibles aislamientos de utilizar al iniciar una transacción:

{ 
    READ_UNCOMMITTED: "READ UNCOMMITTED", 
    READ_COMMITTED: "READ COMMITTED", 
    REPEATABLE_READ: "REPEATABLE READ", 
    SERIALIZABLE: "SERIALIZABLE" 
} 

pase en el nivel deseado como primer argumento:

return sequelize.transaction({ 
    isolationLevel: Sequelize.Transaction.SERIALIZABLE 
}, function (t) { 

// your transactions 

}).then(function(result) { 
    // transaction has been committed. Do something after the commit if required. 
}).catch(function(err) { 
    // do something with the err. 
}); 
Cuestiones relacionadas