AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Erhöhen eines Wertes in einer Datenbanktabelle
Thema durchsuchen
Ansicht
Themen-Optionen

Erhöhen eines Wertes in einer Datenbanktabelle

Ein Thema von sirius · begonnen am 15. Apr 2010 · letzter Beitrag vom 15. Apr 2010
Antwort Antwort
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#1

Erhöhen eines Wertes in einer Datenbanktabelle

  Alt 15. Apr 2010, 14:57
Datenbank: Oracle • Version: 11 • Zugriff über: DOA
Wie schaffe ich es transaktionssicher einen Wert in einer Spalte einer Datenbanktabelle zu erhöhen.

Also Beispiel (ist in einer Stored Procedure):
SQL-Code:
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=...;
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


Danke für Antworten.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Erhöhen eines Wertes in einer Datenbanktabelle

  Alt 15. Apr 2010, 15:23
SQL-Code:
update
    Tabelle
set
    Column=Column + 10
where
    id=...;
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Linor
Linor

Registriert seit: 19. Mai 2008
Ort: Holzwickede
60 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Erhöhen eines Wertes in einer Datenbanktabelle

  Alt 15. Apr 2010, 15:25
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:
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;
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.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Erhöhen eines Wertes in einer Datenbanktabelle

  Alt 15. Apr 2010, 15:30
Zitat von mkinzler:
SQL-Code:
update
    Tabelle
set
    Column=Column + 10
where
    id=...;
Merci
Aber schön, dass es so einfach ist.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:43 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