Announcement

Collapse
No announcement yet.

Transaktion atomic durchführen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Transaktion atomic durchführen

    Hi,

    zuerst einmal, ich nutze Java und Mysql 5.1.

    Wie erreiche ich es am modischsten Transaktionen atomic durchführen zu können?

    Stored Procedures reagieren laut aktueller Beschreibung nicht auf das Schlüsselwort atomic. Weiß jemand ab welcher MySQL Version das vorgesehen ist, respektive bis wann ?

    Alles andere würde ja dann aus Java heraus geregelt, da hab ich keine Ahnung ob das dann Atomic ist.

    1. Bei der Connection das autoCommit abschalten. Mehrere preparedStatements definieren. und dann auf der Connection von Hand das commit aufrufen

    2. Mehrere Statements in ein preparedStatemant packen (als Batch) und dann halt das eine preparedStatement ausführen.
    (Hab ich aber bei nem kurzen Versuch nicht hinbekommen)

    Wäre super wenn jemand was dazu sagen könnte.

    Beste Grüße

    Boozer

  • #2
    Habe gerade beim Recherchieren den START TRANSACTION Befehl gesehen.

    Macht das prinzipiell das Selbe als würde ich meine Java Connection auf autoCommit = false stellen ?

    Bei einem eventuellen Fehler wird doch bei einer Menge von Transaktionen, welche von einem START TRANSACTION eingeleitet wurden automatisch ein ROLLBACK gemacht, oder?

    Comment


    • #3
      Eine Transaktion ist per Definition immer atomar -alles oder nichts. Es gibt jedoch Datenbanken, die sich nicht so ganz daran halten bzw. auch keine Transaktionen anbietet. Wenn Du myisam Tabellen verwendest hast Du meines Wissens schon mal schlechte Karten.

      Bei einem eventuellen Fehler wird doch bei einer Menge von Transaktionen, welche von einem START TRANSACTION eingeleitet wurden automatisch ein ROLLBACK gemacht, oder?
      Es gibt keine Untertransaktionen. Eine Transaktion kann, sofern die DB das unterstützt, Savepoints haben, auf die zurückgerollt werden kann.

      Sind mehrere DML Vorgänge in einer Transaktion vorhanden und eine schlägt fehl, entscheidest Du selbst was passieren soll. Du kannst entweder komplett zurückrollen, auf einen Savepoint zurückgehen oder die Anweisung überspringen und weitermachen.

      Macht das prinzipiell das Selbe als würde ich meine Java Connection auf autoCommit = false stellen ?
      Sollte es, wobei es Datenbanken gibt, die das impliziet machen. Sprich ein Commit bzw. Rollback ist das Ende und der Beginn einer neuen Transaktion. Andere Datenbanken wiederum haben einen Autocommitmechanismus der explizit ausgeschaltet werden muss und über BEGEN TRANSACTION gesteuert wird. Hier musst Du in der mysql Doku nachlesen, was mysql mit der von dir verwendeten Engine bietet und wie der JDBC Treiber implementiert wurde.

      Dim
      Zitat Tom Kyte:
      I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

      Comment


      • #4
        Hi,

        ich meinte mit einer Transaktion einen Vorgang, der mehrere Änderungen/Abfragen auf der Datenbank nach sich zieht, die entweder alle oder Nichts davon getätigt werden sollen.

        Bsp.
        Ein Neues Dokument soll in die Datenbank eingetragen werden beinhaltet:
        1. Anlegen des Neuen Dokumentes
        2. Auslesen der Id (gab es da nicht auch einen Befehl dass man die automatisch beim eintragen zurückbekommt, oder konnte das nur die DB2 und MySQL nicht?)
        3. Anlegen eines Verteilers mit verweis auf die Id
        4. Eintragen der Personen die zu dem Verteiler gehören
        ...

        Da sich nicht alles über Trigger realisieren lässt wollte ich es aus dem Programm raus machen.

        Ich verwende die InnoDB und so wie ich die Doku verstanden habe reicht es aus wenn ich ein START TRANSACTION an die DB sende, dann die einzelnen SQL-Querys und alles mit einem COMMIT lostrete.
        SOllte dann irgendwo ein Fehler auftreten macht die DB von sich aus ein ROLLBACK.

        Sollte eigentlich meinen Anforderungen genügen.

        Problem wäre jetzt nur noch,m dass zwischen manchen SQL-Querys ja auch Java Programmcode liegt. Da muss ich noch experimentieren.

        Gruß

        Comment


        • #5
          ich meinte mit einer Transaktion einen Vorgang, der mehrere Änderungen/Abfragen auf der Datenbank nach sich zieht, die entweder alle oder Nichts davon getätigt werden sollen.
          Davon rede ich auch.

          Auslesen der Id (gab es da nicht auch einen Befehl dass man die automatisch beim eintragen zurückbekommt, oder konnte das nur die DB2 und MySQL nicht?)
          Nein das geht auch mit mysql.

          Ich verwende die InnoDB und so wie ich die Doku verstanden habe reicht es aus wenn ich ein START TRANSACTION an die DB sende, dann die einzelnen SQL-Querys und alles mit einem COMMIT lostrete.
          Dazu solltest Du dir die Doku des Mysql JDBC Treibers durchlesen um ganz sicherzugehen. Erst dann weißt Du, wie diese Methode implementiert wurde. Insbesondere den Teil mit START TRANSACTION. Commit ist ja klar.

          SOllte dann irgendwo ein Fehler auftreten macht die DB von sich aus ein ROLLBACK.
          Nein. Das musst schon Du machen. Die DB macht nur das einzelne, fehlerhafte Statement rückgängig und Du bekommst in Java eine SQLException und damit den eigentlichen Fehler. Im catch Block kannst Du dich dann entscheiden einen rollback auszuführen, oder weiterzumachen.

          Problem wäre jetzt nur noch,m dass zwischen manchen SQL-Querys ja auch Java Programmcode liegt. Da muss ich noch experimentieren.
          Das interessiert doch die Datenbank nicht.

          Dim
          Zitat Tom Kyte:
          I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

          Comment


          • #6
            Okay, vielen Dank schonmal.
            Ich werde jetzt erstmal wieder ausprobieren. Falls etwas nicht funktioniert melde ich mich noch mal.

            Besten Dank

            Boozer

            Comment

            Working...
            X