PDA

Vollständige Version anzeigen : Sperren aller Sätze einer Tabelle


Kalle Reiber
29.05.2007, 08:44
Hallo,

ich möchte in einer Mehrbenutzerumgebung per VBA mehrere Sätze in eine Tabelle einfügen. Diese Sätze sollen eine gemeinsame Zahl als Kennung erhalten. Die Kennung wird gebildet aus der in dieser Tabelle höchsten vorhandenen Zahl + 1.
In der Abarbeitung wird also aus den vorhandenen Sätzen zunächst die höchste vorhandenen Zahl ermittelt. Dann werden die Datensätze erzeugt und eingefügt. Das Einfügen dauert eine gewisse Zeit. Erst danach ist auch die (neue) benutzte Kennung für andere Benutzer der Datenbank sichtbar.

Da es in einer Mehrbenutzerumgebung vorkommen kann, daß mehrere Personen gleichzeitig die Funktion anstoßen, könnte es vorkommen, daß parallel als höchste vorhandene Zahl in der Tabelle der gleiche Wert ermittelt wird.
Das Setzen von Sperrungen im Formular entfällt, da kein Formular verwendet wird.
Das Setzen von Sperrungen über "Extras/Optionen ..." entfällt, da das alle Tabellen betreffen würde.
Das Setzen von Sperrungen im Recordset entfällt, da ich die Sätze über ein dynamisches SQL erzeuge und einfüge.

Nun endlich meine Frage: Wie kann ich durch Sperren aller Sätze der Tabelle für die Zeit vom Ermitteln der höchsten Zahl bis zum vollständigen Einfügen der neuen Sätze erreichen, daß nicht parallel mehrere Benutzer die gleiche "neue höchste Zahl" ermitteln ?

Ich arbeite mit Access 2003 / Office 2003 / Windows 2000

Danke für Eure guten Einfälle

FW
29.05.2007, 10:18
... warum benutzt Du nicht einfach einen AutoWert?

Kalle Reiber
29.05.2007, 10:24
Hallo FW,

... weil immer mehrere Sätze die gleiche Zahl als Kennung erhalten sollen. Mit dem Auto-Wert würde jeder Satz einen anderen Wert bekommen.

Marsu65
29.05.2007, 11:12
Hi Kalle, vielleicht hilfts dir weiter:
Habe zu diesem Zweck eine Extratabelle mit dem Feld [NächsteNummer] eingebaut. Will jemand Datensätze anlegen, wird als erstes die 'aktuelle Nummer' gezogen, um 1 erhöht und sofort wieder zurückgeschrieben. Dadurch ist die 'aktuelle Nummer' quasi reserviert und du hast alle Zeit der Welt. Hat zudem den Vorteil, dass man Anpassungen vornehmen kann, wenn sich mal der Nummernkreis ändern sollte:)

SaschaBHH
29.05.2007, 11:13
Hi,

in einer db habe ich mal einen eine SitzungsID erzeugen wollen. Ich habe dann mit Randomize gearbeitet;

Zitat Access Online-Hilfe:

Randomize-Anweisung (Beispiel)
In diesem Beispiel wird die Randomize-Anweisung verwendet, um den Zufallszahlengenerator zu initialisieren. Da keine Zahl übergeben wurde, verwendet Randomize den Rückgabewert der Timer-Funktion als neuen Startwert.

Dim Wert1
Randomize ' Zufallszahlengenerator initialisieren.

Wert1 = Int((6 * Rnd) + 1) ' Zufallszahlen im Bereich von 1 bis 6
' generieren.

Zitat Ende

Dann musst Du nur noch den Bereich erweitern. Hilft das?

Gruß
SaschaBHH

lalo
29.05.2007, 11:26
Hallo,

eine Alternativlösung ist auch:

1. Anlagen einer Tabelle "ParameterX" in der nur 1 Zeile mit einer Spalte ist = "LfdNr"

2. In einer Transaktion

2.1. Rst-Begintrans

2.2. Tabelle ParameterX Spalte LfdNr lesen, um 1 erhöhen und zurückschreiben

2.3. Die Zeilen mit der neuen Nummer einfügen

2.4. Rst.CommitTrans

Durch die transaktion ist die Zeile in der Tabelle ParameterX bis zum Ende der Transaktion gesperrt.

Gruß Bernd

Kalle Reiber
29.05.2007, 12:22
Hallo,
vielen Dank für Eure Hinweise. Die Varianten mit der Extra-Tabelle haben ja alle den gleichen Grundgedanken. Ich werde diese Richtung mal weiterverfolgen und mich dann nochmal melden, ob es funktioniert.