Hintergrund
Ich habe eine Menge verschiedener "Dinge" (ein domänenspezifischer Gegenstand / Gegenstand / Gegenstand), die für die "Ding" -Eigentümer (Menschen) sichtbar sind. Die Besitzer werden ihre "Dinge" mit einer Nummer identifizieren. Anstatt eine große "zufällige" Zahl zu zeigen, möchte ich ihnen eine kleine Zahl zeigen (vorzugsweise eine Sequenz, die bei 1 beginnt), die für Menschen einfacher ist. Die Besitzer sprechen sehr gerne von "my foo 37" und "your bar 128". Dort kann "Sequenz" Lücken haben, aber die angehängte Zahl muss während der Lebenszeit der "Sache" gleich bleiben. Also brauche ich einen Weg, um "Sache" + Besitzer spezifische ID (derzeit als "sichtbare ID") zu generieren.
Die Anzahl der "Ding" + Besitzer-Kombinationen ist im Maßstab von 10k +. Derzeit können neue "Dinge" nicht dynamisch generiert werden, aber die Eigentümer können sein.
Die Anzahl der "Ding" -Instanzen pro Besitzer ist relativ klein, ungefähr zehn pro Besitzer, aber es gibt keine feste Begrenzung, die aus den Geschäftsregeln abgeleitet werden kann. Neue "Ding" -Instanzen werden häufig erstellt und gelöscht.
Berücksichtigte Optionen
Ich fand eine gute Diskussion in einer SO-Frage Oracle Partitioned Sequence , die ziemlich genau das gleiche Problem behandelt, das ich habe.
Bisher habe ich die folgenden Optionen in Betracht gezogen:
max(visible_id) + 1
betrachtet, aber wir werden damit normale Nebenläufigkeitsprobleme bekommen, also ist es ein No-Go. Frage
Gibt es eine andere Möglichkeit, dieses Problem zu beheben, oder sollte ich mit der dynamischen Erstellung von Sequenzen beginnen? Wenn die Sequenzen die Antwort sind, bitte erläutern Sie, welche Fallstricke es gibt (wie implizite Commits in DDL).
Ich bin an Oracle 11gR2- und 12c-Lösungen interessiert (wenn sie anders sind).
Pseudocode zur Veranschaulichung der Frage
%Vor%Da Lücken in Ordnung sind, sollten Sie eine Variante von "Option 2" implementieren. Das Zulassen von Lücken bedeutet, dass Ihre Synchronisierung schnell durchgeführt werden kann: Bei konkurrierenden Sitzungen wird lediglich überprüft und weitergeschaltet, anstatt warten zu müssen, ob die anderen das Commit oder Rollback durchführen.
Wenn Oracle eine Option INSERT INTO..NOWAIT
anbietet, wäre das einfach. Wie die Dinge sind, würde ich wahrscheinlich DBMS_LOCK
einbeziehen. Hier ist meine Vorstellung davon, wie Ihre API aussehen würde.
Es macht einige Annahmen über die maximale sichtbare ID, die Sie haben, weil Sie diese Annahmen in Ihrem ursprünglichen Post gemacht haben.
%Vor%