2017-06-22 4 views
0

Gibt es eine bessere Möglichkeit, Transaktionen mit der mariasql-Bibliothek zu verwenden, als BEGIN zum Anfang der Abfrage hinzuzufügen und mit einem Commit oder einem Rollback abzuschließen?Verwenden Sie Transaktionen mit Mariadb und node.js

Derzeit wenn ich eine Reihe von Abfragen in einer Transaktion wickeln will, muss ich so etwas wie dies tun:

const MariaClient = require('mariasql'); 
let client = new MariaClient(); 

client.connect({ 
    host: "127.0.0.1", 
    user: "user", 
    password: "pass", 
    db: "some_db", 
    multiStatements: true 
}); 

client.query('BEGIN; INSERT INTO some_table VALUES ("a0","b0"), ("a1","b1"), ("a2","b2");', function (err) { 
    if (err) { 
     client.query('ROLLBACK;'); 
    } 
    client.query('COMMIT;'); 
}); 

Diese klobigen scheint und möglicherweise fehleranfällig. Wir verwenden den generic-pool, um den Mariadb-Client zu verwalten. Es scheint also, als könnte es einige unbeabsichtigte Konsequenzen geben, Transaktionen auf diese Weise zu behandeln.

+0

'client.beginTransaction' ist nicht vorhanden? Wenn nicht, verwenden Sie stattdessen die mysql-Bibliothek –

Antwort

1

Plan A: Wenn autocommit auf 1 gesetzt ist, dann ist jede Anweisung ihre eigene Transaktion. No BEGIN/COMMIT benötigt.

Plan B: Suck it up und separaten Aufrufen der API für jede Anweisung hier:

BEGIN; 
some SQL statement; 
some SQL statement; 
some SQL statement; 
COMMIT; 

Wenn die API spezielle Anrufe für BEGIN und COMMIT hat, sie verwenden Sie stattdessen die entsprechenden SQL der Durchführung ; Es kann sein, dass sich etwas Wichtiges im Anruf versteckt.

In beiden Fällen müssen Sie bei allen Schritten auf Fehler prüfen. Deadlocks können passieren, wenn Sie sie am wenigsten erwarten.