Datenbank: Oracle • Version: 11 • Zugriff über: DOA
Erhöhen eines Wertes in einer Datenbanktabelle
Wie schaffe ich es transaktionssicher einen Wert in einer Spalte einer Datenbanktabelle zu erhöhen.
Also Beispiel (ist in einer Stored Procedure):
SQL-Code:
Was ist, wenn gleichzeitig zwei User den Wert aus Column abfragen, dann wird er nicht um 20 erhöht (wenn die User nacheinander die SP ausgeführt hätten, sondern nur um 10. Wie kann ich das verhindern
Select Column into c from Tabelle
where id=...; c:=c+10; -- 10 ist eigentlich eine Variable/Parameter der SP update Tabelle set Column=c where id=...; Danke für Antworten. |
Re: Erhöhen eines Wertes in einer Datenbanktabelle
SQL-Code:
update
Tabelle set Column=Column + 10 where id=...; |
Re: Erhöhen eines Wertes in einer Datenbanktabelle
Hallo,
um das ganze Transaktionssicher zu machen, musst den Datensatz vorher sperren und überprüfen ob du die Sperre erhalten hast. Da ein Datensatz nur einmal gesperrt werden kann, und wenn das dann alle Instanzen so machen, ist sichergestellt das nur einer schreibend auf den Satz zugreifen kann.
Code:
Das entscheidende ist das Starten der Transaktion und dem select for update, dies kann immer nur einer machen, und die Sperre bleibt solange erhalten bis das ein Commit oder Rollback kommt. Die Ausnahme bei Oracle hängt aber davon ab welchen Isolationslevel du eingestellt hast, entweder Ausnahme oder warten bis die Sperre des anderen Benutzers weg ist.
StartTransaction;
try try > select * from table where id = ... for update > update table set column = column + 10 where id = ... CommitTransaction; except Sperre nicht erhalten! end; finally RollbackTransaction; < Wirkungslos wenn vorher commit! end; |
Re: Erhöhen eines Wertes in einer Datenbanktabelle
Zitat:
Aber schön, dass es so einfach ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz