Oracle-Sequenztransaktionalität

9

Ich brauche für ein bestimmtes Geschäftsszenario ein Feld für eine Entität (nicht die PK) eine Zahl aus einer Sequenz (die Sequenz muss eine Zahl zwischen min und max sein

)

Ich habe die Reihenfolge so definiert:

%Vor%

In Java code erhalte ich die Nummer aus der Sequenz wie folgt:

%Vor%

Meine Frage ist:

Wenn ich dieses " select mySequence.nextval from dual " in einer Transaktion und gleichzeitig in einer anderen Transaktion die selbe Methode (parallele Anfragen) anrufe, ist es sicher, dass die von der Sequenz zurückgegebenen Werte verschieden sind?

Ist es nicht möglich, den nicht festgeschriebenen Wert aus der ersten Transaktion zu lesen?

Weil ich angenommen hätte, dass ich keine Sequenz und eine einfache Tabelle verwendet hätte, wo ich die Sequenz inkrementieren würde, dann hätte die Transaktion 2 denselben Wert lesen können, wenn die Trasactionality der Standard "READ COMMITTED" war.

    
Cris 24.08.2012, 06:45
quelle

4 Antworten

25

Die Antwort ist NEIN.

Oracle garantiert, dass durch Sequenz erzeugte Zahlen unterschiedlich sind. Selbst wenn parallele Anforderungen ausgegeben werden, werden RAC-Umgebungen oder Rollbacks und Commits gemischt.

Sequenzen hat nichts mit Transaktionen zu tun.

Siehe hier die Dokumentation :

  

Verwenden Sie die Anweisung CREATE SEQUENCE, um eine Sequenz zu erstellen, die a lautet   Datenbankobjekt, von dem mehrere Benutzer unique generieren können   ganze Zahlen. Sie können Sequenzen verwenden, um den Primärschlüssel automatisch zu generieren   Werte.

     

Wenn eine Sequenznummer generiert wird, wird die Sequenz inkrementiert,    unabhängig der Transaktion, die rückgängig gemacht oder rückgängig gemacht wird. Wenn zwei   Benutzer erhöhen gleichzeitig die gleiche Sequenz und dann die Sequenz   Nummern, die jeder Benutzer erwirbt, können Lücken aufweisen, weil die Folgenummern sind   wird vom anderen Benutzer generiert. Ein Benutzer kann niemals die   Sequenznummer, die von einem anderen Benutzer generiert wurde. Nach einem Sequenzwert ist   Wenn dieser Benutzer von einem Benutzer generiert wird, kann er weiterhin auf diesen Wert zugreifen   unabhängig davon, ob die Sequenz von einem anderen Benutzer inkrementiert wird.

     

Sequenznummern werden unabhängig von Tabellen generiert, also gleich   Sequenz kann für eine oder mehrere Tabellen verwendet werden. Es ist möglich   Diese einzelnen Sequenznummern werden anscheinend übersprungen, weil   Sie wurden generiert und in einer Transaktion verwendet, die letztendlich gerollt wurde   zurück. Darüber hinaus kann ein einzelner Benutzer nicht erkennen, dass andere Benutzer sind   Zeichnung aus der gleichen Reihenfolge.

    
Florin Ghita 24.08.2012, 07:03
quelle
6

Oracle garantiert Sequenznummern werden anders sein. Selbst wenn Ihre Transaktion zurückgesetzt wird, wird die Sequenz "verwendet" und nicht erneut an eine andere Abfrage ausgegeben.

Bearbeiten: Hinzufügen von zusätzlichen Informationen nach Anforderungen rund um "keine Lücken" wurden in den Kommentaren von Cris

angegeben

Wenn Ihre Anforderungen für eine Folge von Zahlen ohne Lücken gelten, sind Orakelsequenzen wahrscheinlich keine geeignete Lösung, da es Lücken gibt, wenn Transaktionen zurückgesetzt werden oder wenn die Datenbank neu gestartet wird Anzahl der Szenarien.

Sequenzen sind in erster Linie als Hochleistungsgenerierungswerkzeug für eindeutige Zahlen (z. B. Primärschlüssel) gedacht, ohne Rücksicht auf Lücken und Transaktionskontextbeschränkungen.

Wenn Ihre Design- / Business- / Audit-Anforderungen jede Nummer berücksichtigen müssen, müssen Sie stattdessen eine Lösung entwerfen, die eine vorgegebene Anzahl im Transaktionskontext verwendet. Dies kann schwierig und anfällig für Leistungs- / Sperrprobleme in einer Umgebung mit mehreren Threads sein. Es wäre besser zu versuchen, Ihre Anforderung neu zu definieren, so dass Lücken keine Rolle spielen.

    
shonky linux user 24.08.2012 06:57
quelle
4

sequence.nextval gibt niemals denselben Wert (vor dem Zyklus) für die gleichzeitige Anforderung zurück. Vielleicht sollten Sie die folgende URL überprüfen:

Ссылка

    
ntalbs 24.08.2012 06:56
quelle
1

Leider müssen Sie Ihre "eigene Rolle" - Transaktionsfolge implementieren. Es ist ziemlich einfach - erstellen Sie einfach die Tabelle wie sequence_name varchar2, Wert, min_value Nummer, max_value Nummer, need_cycle char und herumspielen 'wählen Sie Wert in Variable aus Ihrer Sequenztabelle für Update warten (oder jetzt - es hängt von Ihrem Szenario)'. Nach der Ausgabe des update set value = Variable aus dem vorherigen Schritt + 1 wobei sequence_name = der Name Ihrer Sequenz und die Commit-Anweisung von der Client-Seite aus ausgeben. Das war's.

    
Alexander Tokarev 24.08.2012 07:08
quelle