Wie führe ich die Rollbacks und die Commits korrekt in meiner Node-Applikation aus?

  • Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Tabula_Rasa

Mitglied
12 Mai 2017
239
2
18
Hallo zusammen,

ich benutze folgendes Modul: https://www.npmjs.com/package/mssql.

Ich habe die Dokumentation angeschaut und da führen die nur eine Request mit Rollback und Commit durch - ich habe jedoch drei und erhielt andauernd Fehler. Aus diesem Grund wollte ich hier mal nachfragen, wie ich die Requests in der Transaction gestalten muss.

Javascript:
router.post('/post/sichern', (req, res, next)=> {

    const transaction = new sql.Transaction();
    const request1 = new sql.Request();
    const request2 = new sql.Request();
    const request3 = new sql.Request();
    const analysen = req.body.analysen; // Array of objects of type {id: number, name:string}

    request1.input('o_id', req.body.order.id);
    request2.input('o_id', req.body.order.id);

    const query1 = 'Update orders set ais=1 where o_id=@o_id'; // für request1
    const query2 = 'Delete from analysen where o_id=@o_id'; // für request2
    
    transaction.begin(async error => {
        if(error) return res.status(500).json(error);

       // Hier müssen die Requests hin mit Rollback bei einem Fehler und Commit bei keinem
      
    })

})

Der request3 ist dafür da, die Analysen in die Datenbank einzufügen, jedoch bin ich mir nicht sicher, ob ich diese in einer Loop einfügen soll, weil ich da auch Fehler erhielt. Aus diesen Gründen wollte ich hier mal nachfragen, damit ich verstehe, wie eine Transaction mit mehreren Requests und deren Commits und Rollbacks aussehen muss.
 

Sempervivum

Senior HTML'ler
18 Oktober 2016
2.081
404
83
67
Vermutlich liegt das Problem hier:
wie eine Transaction mit mehreren Requests und deren Commits und Rollbacks aussehen muss.
Wenn ich das Konzept richtig verstehe ist es so, dass zu jeder Transaktion ein und nur ein Commit oder Rollback gehört, aber mehrere Requests darin möglich sind. Wenn Du jeden deiner Requests mit einem eigenen Commit oder Rollback versehen willst, musst Du auch für jeden eine Transaktion aufmachen.
Und wenn ich das Konzept von Transaktionen weiter richtig verstehe, liegt die Stärke vor allem darin, dass die Konsistenz der Datenbank sicher gestellt werden kann, wenn z. B. alle von drei Requests, zwischen denen Abhängigkeiten bestehen, erfolgreich sein müssen. Schlägt einer fehl, kann man die ganze Transaktion zurück rollen und die Datenbank ist wieder konsistent.
So weit mein Verständnis dieser Sache aber Datenbanken sind nicht unbedingt mein Schwerpunkt.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Tabula_Rasa

Tabula_Rasa

Mitglied
12 Mai 2017
239
2
18
Vermutlich liegt das Problem hier:

Wenn ich das Konzept richtig verstehe ist es so, dass zu jeder Transaktion ein und nur ein Commit oder Rollback gehört, aber mehrere Requests darin möglich sind. Wenn Du jeden deiner Requests mit einem eigenen Commit oder Rollback versehen willst, musst Du auch für jeden eine Transaktion aufmachen.
Und wenn ich das Konzept von Transaktionen weiter richtig verstehe, liegt die Stärke vor allem darin, dass die Konsistenz der Datenbank sicher gestellt werden kann, wenn z. B. alle von drei Requests, zwischen denen Abhängigkeiten bestehen, erfolgreich sein müssen. Schlägt einer fehl, kann man die ganze Transaktion zurück rollen und die Datenbank ist wieder konsistent.
So weit mein Verständnis dieser Sache aber Datenbanken sind nicht unbedingt mein Schwerpunkt.
Hey, du hast vollkommen recht. Mein Fehler war, dass ich innerhalb einer Transaktion mehrmals commitet habe (dachte nämlich man müsse nach jeder Request committen). Ein Commit am Ende reicht vollkommen aus.
 
Werbung: