AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Record Locking mit Delphi
Thema durchsuchen
Ansicht
Themen-Optionen

Record Locking mit Delphi

Ein Thema von GreenHorn3600 · begonnen am 24. Jun 2007 · letzter Beitrag vom 25. Jun 2007
Antwort Antwort
Seite 1 von 2  1 2      
GreenHorn3600

Registriert seit: 24. Jun 2007
165 Beiträge
 
#1

Record Locking mit Delphi

  Alt 24. Jun 2007, 10:31
Datenbank: Access oder auch was anderes • Zugriff über: ADO/ODBC
Hallo Zusammen,

ich weiss, dass dieses Thema nicht sonderlich populär ist (die Suche gibt 4 Treffer aus, welche mir nicht weiterhelfen), aber vielleicht kennt ja doch jemand wie man einen Datensatz in einer Datenbank via ODBC locken kann. ich stelle mir das wie folgt vor....

Code:
lock record for update (primary index fields) in table xxx;
if locked then
begin
 ....
 release locked record;
end
else
 fehlermeldung(record konnte nicht gelockt werden);
kennt jemand hierzu die konkreten befehle um so etwas zu realisieren?

Herzlichen Dank
GreenHorn
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Record Locking mit Delphi

  Alt 24. Jun 2007, 10:39
In modernen DBMS ist Locking nur selten nötig, da dies durch eine Transaktionssteuerung teilweise umgangen werden kann oder sie besitzen besondere SQL-Erweiterungen wie "with lock" select .. for update" welchen dann ein Locking veranlassen.
Aus deiner Fragestellung geht jetzt nicht genau hervor, ob du mit Access arbeiten willst oder noch ein geeignetes DBMS suchst.
Warum ODBC?
Markus Kinzler
  Mit Zitat antworten Zitat
GreenHorn3600

Registriert seit: 24. Jun 2007
165 Beiträge
 
#3

Re: Record Locking mit Delphi

  Alt 24. Jun 2007, 10:55
hallo MKinzler,

für keine Datenspeicherungen nehme ich gern Access, da die Daten in nur einer Datei abgespeichert werden. So lange das Progy auf nur einen Rechner läuft, fühle ich mich wohl. Wenn ich es jedoch im Netzwerk einsetzen möchte, kommt automatisch die Frage, wie kann man die Daten vor gegenseitigen überschreiben schützen. Dabei schwebt mir vor, dass zwischen den letzten lesen, wo der status in ordnung war und der update operation, der datensatz vor veränderung geschützt wird, nur wie kann man diesem entsprechend allokieren, damit er nicht verändert wird? Eine Abstraktionsschicht auf dem Server einzuziehen, bei dem die Datensätze "logisch" gesperrt werden können, ist eine Möglichkeit, hab nur keine Lust so ein Monster zu Programmieren, da dies doch eine Funktion der Datenbank sein muss (für was braucht man sonst eine Datenbank, um nicht die integrität der Daten zu gewährleisten).

Hoffe dies dient zur Erläuterung. Wie umgeht Ihr so die Problematik des gegenseitigen überschreibens?

Grüsse
GreenHorn

PS:
  • nehme auch noch gern den MS SQL Server, dieser ist jedoch nicht transportabel.
  • ODBC nehme ich gern, um unabhängig von der Datenbank zu sein und ggf. auch auf einer anderen Datenbank aufsetzen zu können
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Record Locking mit Delphi

  Alt 24. Jun 2007, 11:02
Ich kenne mich mit Access (programmiertechnisch) nicht so aus, kenne nur dessen Zicken als Anwender und würde deshalb von dessen Anwendung abraten.
Wenn du ein richtiges DBMS einsetzt umgehst du deine Probleme.
Vom MSSQL-Server gibt es verschiedene Versionen z.B. die MSDE/SQL2005 express oder compact, so das die Dateien transportabel sind.
ODBC ist veraltet und einfach portierbar sind die Anwendungen dann trotzdem nicht.
es gibt hier im Forum viele Beiträge, die sich mit DB-Alternativen beschäftigen, vielleicht findest du dann auch die Datenbank, die für deine Problem geeignet ist
Markus Kinzler
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Record Locking mit Delphi

  Alt 24. Jun 2007, 13:33
Hallo,

Locking mittels ADO geschieht standardmäßig und vollautomatisch auf Page-Level (2048 Byte), sodass in der Regel mehr als ein Record gesperrt wird. Der Entwickler kann aber der automatischen Lock Escalation reinpfuschen, wenn er Sperren auf RecordSet- oder Database-Level anfordert. ODBC bietet keine Locking Funktionalität und sollte ADO über ODBC eingestzt werden, dann ignoriert ODBC Sperrversuche solange es geht und bringt ansonsten Fehlermeldungen.

Bei den automatischen Sperrmechanismen lässt sich noch der LockMode einstellen: Optimistic oder Passimistic. SQL-Server arbeiten in der Regel optimistisch (Sperren so spät wie möglich), Access und Co. mit pessimistischen (so früh wie möglich) Sperren.

Es ist Aufgabe des Entwicklers auf die Fehler zu reagieren, die durch konkurrierende Zugriffe im Mehrbenutzerbetrieb auftreten. Die Sperren selbst werden optimal von der Transaktionskontrolle der DB-Engine verwaltet.

Grüße vom marabu
  Mit Zitat antworten Zitat
GreenHorn3600

Registriert seit: 24. Jun 2007
165 Beiträge
 
#6

Re: Record Locking mit Delphi

  Alt 24. Jun 2007, 18:19
hallo Marabu,

wenn ich dich recht verstehe, brauche ich da nichts zu machen, da der Server das sperren automatisch übernimmt. demnach vom letzten lesenden auf dem schreibenden/lesenden zu griff.

klingt ja nett... nur so ganz glauben kann ich es nicht

grüsse
und noch einen schönen Sonntag.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Record Locking mit Delphi

  Alt 24. Jun 2007, 19:06
Hallo,

hier noch ein wenig Hintergrundinfo, versteckt in den VB-Quellzeilen dieses Knowledgebase-Artikels: How to Use the Three Levels of Database Locking in VB 3.0

Dir auch noch einen schönen Sonntag.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Record Locking mit Delphi

  Alt 24. Jun 2007, 19:56
GreenHorn3600: Access ist eine Desktop-Datenbanke (Einzelplatz), die mit viel Mühe mehr schlecht als recht auf 'Mehrbenutzer' getrimmt wurde.

Mehrbenutzerbetrieb und Access schließen sich gegenseitig aus, auch wenn immer noch sehr viele MB-Anwender mit Access entwickelt werden.

Lass die Finger davon.

Wir haben einen Lockmechanismus bei einer Kundenverwaltung implementiert: Benutzer A fordert Kundendatensatz XY an und will ihn verändern. Vorher schickt er eine Lock-Anforderung an die Mittelschicht. Sofern die Lockanforderung erfolgreich war, kann er den Datensatz verändern, die Änderungen speichern und den Lock wieder aufheben.

Du musst dann Vorkehrungen treffen, das das 'Unlock' z.B. infolge eines Rechnerabsturzes nie aufgehoben wird, beispielsweise durch ein 'Zwangsunlock' nach 10 Minuten: Der Benutzer muss sich dann eben etwas beeilen.
100% vollautomatisch und ohne jegliche manuelle Eingriffe in seltenen Extremsituationen wird das nicht funktionieren, wiel nach Murphy immer irgendwo etwas schief geht.

Nach meiner Erfahrung ist dieses Locking keine gute Idee, besser ist eine Konfliktbehandlung, also wenn zwei Anwender Änderungen am Datensatz simultan vornehmen wollen.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.198 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Record Locking mit Delphi

  Alt 24. Jun 2007, 21:09
Zitat von marabu:
Locking mittels ADO geschieht standardmäßig und vollautomatisch auf Page-Level (2048 Byte),
Diese Regel gilt aber auch nur beim MS SQL Server auch aufgrund der einschränkungen der Implementierung? AFAIK kann die 2005er-Version auch Sperren auf Satz-Ebene.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Record Locking mit Delphi

  Alt 24. Jun 2007, 21:59
Hallo Bernhard,

time flies.

Dein von mir zitierter Satz bezog sich leider auf eine ältere Version von Access, denn soeben habe ich beim Recherchieren gelernt, dass Access 2000 seinen default lock mode auf Optimistic setzt. Darüber hinaus scheint Pessimistic bei diesem Produkt ein Synonym für Record-Level Locking zu sein. Die Page-Size wurde auch verdoppelt. KB225926

Meine Aussagen bezogen sich in erster Linie auf MS Access, da der OP es bei seinem Beitrag als DBMS angegeben hat. Mit SQL Server 2005 habe ich noch keine Erfahrungen, aber wenn wir da von Neuerungen sprechen wollen, dann müsste das Thema RLV (Row Level Versioning - Hallo Interbase) heißen - oder? Technet

Ansonsten kennt schon der SQL Server 2000 eine Page-Size von 8KByte und insgesamt sechs Lock Typen, darunter zwei auf Record-Ebene: Einer sperrt Records auf einem Heap und der andere Records in einem Index. Ich vermute, dass diese Sperren nicht vom Entwickler kontrolliert werden können, bin mir aber keineswegs sicher.

Ich verlinke mal Server Books Online 2005, da ich schlecht auf meine 2000-er Ausgabe verlinken kann: klick

Freundliche Grüße
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 22:12 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