Entwickler-Ecke

Datenbanken - Paradox - Lock auf Tabelle


Sebastian01 - Mo 01.03.04 19:59
Titel: Paradox - Lock auf Tabelle
Hallo,

ich habe ein kleines Problem und kann keinen Lösungsansatz finden.
Ich verwende D7, BDE, Paradox und möchte gerne in eine DB einen Datensatz mit einer einzigartigen ID einfügen, jedoch NICHT auto_increment verwenden (selbst, wenn es damit geht, möchte ich wissen, wie ich das Problem lösen kann 8) )

Also: folgendes Query an die DB um die nächste freie ID zu finden:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
SaveData[Nr].Close;
SaveData[Nr].SQL.Clear;
SaveData[Nr].SQL.Add('select max(id) from test');
SaveData[Nr].Prepare;
SaveData[Nr].Open;
SaveData[Nr].First;
if SaveData[Nr].eof then id:=1
else if SaveData[Nr].Fields[0].Value=NULL then id:=1
else id:=SaveData[Nr].Fields[0].Value+1;
SaveData[Nr].Close;


So, nun steht in ID der nächste freie Wert.
Als nächstes wird das Insert gemacht


Delphi-Quelltext
1:
2:
3:
4:
5:
SaveData[Nr].SQL.Clear;
SaveData[Nr].SQL.Add('Insert into test ');
SaveData[Nr].SQL.Add('(id, info) values ('+IntToStr(befund_id)+', 3)');
SaveData[Nr].ExecSQL;
SaveData[Nr].Close;



So weit - so gut - funktioniert alles.

Jetzt würde ich allerdings um diese beiden Anweisungen herum ein Lock auf die Tabellen legen (in MySql einfach mit einem "lock table write"), damit sichergestellt ist, daß eine ID nicht zweimal verwendet wird, weil eine andere Stelle im Prg genauso vorgeht.

Ich habe schon nach "Lock" und "Transactions" hier im Forum gesucht, aber nichts sinnvolles gefunden; auch die localsql.hlp hat mich nicht weitergebracht :( :(

Kann jemand helfen ?

lg
Sebastian


CenBells - Mo 01.03.04 20:15

Hallo,

ich weiß nicht ob exclusive locking auf eine Paradox Tabelle geht. Verwendest du die BDE?

Gruß
Ken


MSCH - Mo 01.03.04 20:35

Paradox ist eine Single-User Tabelle (und schon etwas alt). Locks geht da imho nicht.
Was spricht denn gegen einen Auto-Increment?

Den einzigen Lock den man realisieren könnte, wäre den Satz nach der Bildung der ID sofort einzutragen.
Hat allerdings einen erhöhten aufwand, da wenn der Nutzer/das Programm die Dateneingabe aus welchen Gründen auch immer abbricht, muss dieser Satz wieder gelöscht werden. Leider enstehen aber damit Lücken in der ID-Reihenfolge (wie bei AutoIncrement auch).

grez
msch


Sebastian01 - Mo 01.03.04 20:54

Hallo,

na dann kann ich lange suchen :-)
@CenBells: Ja, die BDE verwende ich.

Zum Glück handelt es sich nicht um eine Dateneingabe, sondern lediglich um das Speichern des Datensatzes; diese beiden Kommandos kommen direkt hintereinander; alledings werden die Daten seriell empfangen (ständig), deswegen besteht eine gute Chance, daß es schon mal zu einer Konfliktsituation kommt.

@MSCH: Autoincrement
Ich habe gelesen, daß AutoInc Felder sehr empfindlich sein sollen, wenn die Indizies mal kaputt gehen sollten ? Ich habe von Fällen gelesen, in denen ein Update auch einen neuen Wert auf das AutoInc Feld zugewiesen hat ? Wie sind da deine Erfahrungen ?

lg
Sebastian


MSCH - Mo 01.03.04 21:02

Ein Update auf Auto-Increment (benutze MS-SQLServer) funzt nicht.
Zumindest ist mir das noch nicht gelungen :-). Beim Update einfach das Feld ausnehmen. Wird ja eh korrekt gesetzt.

Und bisher ist mir noch kein Fehler vorgekommen, der auf Auto-IDs beruht. Im gegenteil, hast du diese Felder nicht, spinnen manche SQL-Querries, weil sie die Indentität (bei Updates) nicht finden.

Ich machs immer so, dass die IDs auch immer (einer der ) Primärschlüssel sind.
funzt prima.

grez
msch


Sebastian01 - Di 02.03.04 10:28

Hi !

Ok - ich bin allerdings noch auf ein zweites Problem gestoßen - ich bräuchte "quasi" zwei Autoincrement Zähler, weil einen globalen Zähler habe und einen pro Vorgang, die bei einem Insert jeweils erhöht werden. Den zweiten könnte ich nicht wirklich mit Autoincrement realisieren, aber das Kernproblem ist das gleiche wie oben beschrieben....
Ist Paradox denn wirklich nur Single-User ohne Locks/Transactions ? Was passiert dann im Netzwerk ? Da gibt es doch eine Paradox.net, etc. !?

lg
Sebastian


MAlsleben - Di 02.03.04 10:39

Hi,

um auf eine Paradox - Tabelle ein Lock zu erhalten, kann man diese Tabelle exclusiv öffnen. Dann hat kein anderer User mehr darauf zugreifen. Näheres dazu gibt es in der Delphi Hilfe zu der Eigenschaft Exclusive von Table oder Database. Transaktionen gibt es nicht. Für Query gibt es auch keine entsprechende Eigenschaft. Also müßtest Du dann TTable in Deinem Programm verwenden.

Gruß Micha.