Allgemein Transkationen



  • Hallo Leute,

    und zwar würde ich gerne eine bestimmte Sache bei transaktionen wissen.

    Bsp;

    begin;
    select * from table where id=?;
    [..] update all tables set inc=inc+1
    commit;

    Werden hier alle datensätze,die über select* geholt werden, für alle anderen gesperrt, die ebenfalls die gleiche select anfrage schicken?
    bzw. Was genau wird nach dem begin; synchronisiert?

    Es gibt zwei rechner, die beide parallel datensätze aus der db holen und verarbeiten sollen. natürlich will ich verhindern, dass ein datensatz doppelt ausgewertet wird.

    Würde mich über eine antwort freuen.



  • Hi,

    warum sollten die Datensätze gesperrt werden? Es gibt ein Konzept, das nennt sich Multiversion concurrency control. Dadurch wird sichergestellt, dass jeder Zugriff auf die Datenbank ein konsistenten Ergebnis zurückliefert. Das bedeutet, dass Änderungen, die während der SELECT Abfrage durchgeführt werden, im Ergebnis nicht enthalten sind. Es hat also quasi jeder seine eigene Version der Daten zu einem bestimmten Zeitpunkt.
    http://en.wikipedia.org/wiki/Multiversion_concurrency_control

    Bei einem SELECT wird also gar nichts gesperrt.

    Wenn du eine Tabelle verändern möchtest, bekommst du einen Lock. Bevor deine Transaktion nicht commited wurde, sieht jeder, der eine Abfrage ausführt, den alten Stand, also vor deinem UPDATE. Falls jemand auch versucht, die Tabelle zu verändern, geht das nicht. Die Session muss warten, bis du entweder COMMITest oder ROLLBACKst.



  • okay alles, klar. hatmir weitergeholfen. 👍


Anmelden zum Antworten