mysql + mybatis implementiert gespeicherte Prozedur + Transaktion + gleichzeitigen Mehrfachabruf von Seriennummern

mysql + mybatis implementiert gespeicherte Prozedur + Transaktion + gleichzeitigen Mehrfachabruf von Seriennummern

Gespeicherte Datenbankprozeduren

 DROP-VERFAHREN, WENN „Seriennummer nach Datum generieren“ vorhanden ist;
PROZEDUR ERSTELLEN `Seriennummer_nach_Datum_generieren`(
    IN param_key varchar(100),
    IN param_org_id bigint, 
    IN param_period_date_format varchar(20), 
      OUT-Ergebnis Bigint,
    OUT current_datestr varchar(20))
beginnen 

        deklarieren Sie old_datestr varchar(20);
        
        TRANSAKTION STARTEN; 

        wenn param_period_date_format='unendlich' dann 
            setze current_datestr = '00000000';
    anders
            setze current_datestr = DATE_FORMAT(NOW(), param_period_date_format);
        Ende wenn;
        
        wählen 
                    Nummer, Datumstr 
        von sys_serial_number
        wobei Tabellenschlüssel = Parameterschlüssel 
                und org_id = param_org_id 
                und period_date_format = param_period_date_format
                in Ergebnis, old_datestr
                zum Update;

        WENN das Ergebnis null ist, dann
            
            Setze Ergebnis = 1;
            
            einfügen in sys_serial_number(table_key, org_id, period_date_format, datestr, number, description) 
                Werte (Paramschlüssel, Paramorg_id, Paramperiodendatumsformat, Current_Datestr, 1, „nach Verfahren hinzufügen“);
        
        sonstwenn altes_Datumstr != aktuelles_Datumstr dann
            
            Setze Ergebnis = 1;
            
            Aktualisieren Sie die Systemseriennummer 
                    Satznummer = 1,    
                            datestr = aktuelles_datestr 
            wobei Tabellenschlüssel = Parameterschlüssel 
                    und org_id = param_org_id 
                    und period_date_format = param_period_date_format;
            
        Ende wenn;
        
        Aktualisiere sys_serial_number, setze Nummer = Nummer + 1 
            wobei Tabellenschlüssel = Parameterschlüssel 
                und org_id = param_org_id 
                und period_date_format = param_period_date_format;
    begehen;
Ende

Seriennummerntabelle

Tabelle löschen, wenn `sys_serial_number` vorhanden ist;
CREATE TABLE `sys_serial_number` (
  `table_key` varchar(100) NOT NULL COMMENT 'Primärschlüssel (Tabellenname wird empfohlen)',
  `org_id` bigint(20) NICHT NULL STANDARD '0' KOMMENTAR 'Branch-ID',
  `number` bigint(20) NOT NULL DEFAULT '1' COMMENT 'Seriennummer (inkrementiert durch die gespeicherte Prozedur, +1 nach Erfassung)',
  `period_date_format` varchar(20) NOT NULL COMMENT 'Datumsformat für den Zeitraum der Seriennummerngenerierung',
  `datestr` varchar(20) DEFAULT NULL COMMENT 'Seriennummer Datumswert',
  `Beschreibung` varchar(100) DEFAULT NULL COMMENT 'Beschreibung',
  PRIMÄRSCHLÜSSEL (`table_key`,`org_id`,`perioden_Datumsformat`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Tabelle zur Seriennummerngenerierung';

Mybatis-Konfiguration

<select id="generateSerialNumber" parameterType="java.util.HashMap" statementType="AUFRUFBAR">
    <![CDATA[
           {
           rufen Sie generate_serial_number auf (
            #{param_key,mode=IN,jdbcType=VARCHAR},
            #{param_org_id,mode=IN,jdbcType=BIGINT},
            #{Ergebnis,Modus=OUT,jdbcType=BIGINT}
            )
           }
       ]]>
  </Auswählen>

Testcode

@Überschreiben
    öffentliche Map<String, Objekt> generateSerialNumber(Map<String, Objekt> param) {
        sysSerialNumberMapper.generateSerialNumber(param);
        Rückgabeparameter;
    }
endgültige Map<String, Objekt> param = neue HashMap<String, Objekt>();
        param.put("param_key","Vertrag");
        param.put("param_orgId", 84);
        neuer Thread(neues Runnable() {
            @Überschreiben
            öffentliche Leere ausführen() {
                für(int i =0; i<100; i++) {
                    Map<String, Object> map = serialNumberProvider.generateSerialNumber(param);
                    System.out.println("thread-1: " + map.get("Ergebnis"));
                }
            }
        }).Start();

        neuer Thread(neues Runnable() {
            @Überschreiben
            öffentliche Leere ausführen() {
                für(int i =0; i<100; i++) {
                    Map<String, Object> map = serialNumberProvider.generateSerialNumber(param);
                    System.out.println("thread-2: " + map.get("Ergebnis"));
                }
            }
        }).Start();

        neuer Thread(neues Runnable() {
            @Überschreiben
            öffentliche Leere ausführen() {
                für(int i =0; i<100; i++) {
                    Map<String, Object> map = serialNumberProvider.generateSerialNumber(param);
                    System.out.println("thread-3: " + map.get("Ergebnis"));
                }
            }
        }).Start();

        byte[] b = neues byte[0];
        synchronisiert(b) {
            b.warten();
        }

Wenn Sie den Code ausführen und die folgende Fehlermeldung erhalten

### SQL:
{
rufen Sie generate_serial_number_by_date auf (
?, ?, ?, ?, ?
)
}
### Ursache: java.sql.SQLException: Parameter Nummer 4 ist kein OUT-Parameter
; SQL []; Parameter Nummer 4 ist kein OUT-Parameter; verschachtelte Ausnahme ist java.sql.SQLException: Parameter Nummer 4 ist kein OUT-Parameter

Methode zur Fehlerbehebung:

1. Überprüfen Sie, ob die gespeicherte Prozedur korrekt erstellt wurde

2. Überprüfen Sie, ob der Benutzer der Datenquellenverbindung über die Berechtigung zur Ausführung gespeicherter Prozeduren verfügt

Dies ist das Ende dieses Artikels über die Implementierung von gespeicherten Prozeduren + Transaktionen + mehrfach gleichzeitiger Seriennummernerfassung mit mysql+mybatis. Weitere relevante Inhalte zu gespeicherten Prozeduren mit mysql-mybatis-Seriennummern finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Beispiel für die Verwendung von MySQL-Transaktionsfunktionen zur Implementierung einer gleichzeitigen und sicheren Auto-Increment-ID
  • Lösung für das Problem der gesperrten Transaktionsverarbeitung mit hoher Parallelität in PHP+MySQL
  • Kann die wiederholbare Leseebene von MySQL Phantomlesevorgänge lösen?
  • Detaillierte Erklärung, wie MySQL Phantom-Lesevorgänge löst
  • Lösung für das Problem der MySQL-Transaktionsparallelität
  • Detaillierte Erklärung zu MySQL-Phantomlesevorgängen und wie man sie eliminiert
  • MySQL Series 10 MySQL-Transaktionsisolierung zur Implementierung der Parallelitätskontrolle
  • So lösen Sie das Phantomleseproblem in MySQL
  • Detaillierte Erläuterung des gleichzeitigen Dirty Read + nicht wiederholbaren Read + Phantom Read in MySQL-Transaktionen

<<:  Wie wählt man das perfekte Aloe Vera Gel aus? Perfektes Aloe Vera Gel – So erkennen Sie Echtheit und Fälschung

>>:  Bild-Scrolling-Effekt mit CSS3 erstellt

Artikel empfehlen

Der Unterschied zwischen Löschen, Abschneiden und Löschen und wie man wählt

Vorwort Letzte Woche fragte mich ein Kollege: „Br...

SQL-Implementierung von LeetCode (184. Das höchste Gehalt der Abteilung)

[LeetCode] 184. Abteilung Höchstes Gehalt Die Mit...

JavaScript-Canvas zum Erzielen eines Spiegelbildeffekts

In diesem Artikel wird der spezifische Code für J...

So implementieren Sie eine Array-Lazy-Evaluation-Bibliothek in JavaScript

Inhaltsverzeichnis Überblick So erreichen Sie es ...

HTML-Tabellen-Markup-Tutorial (14): Tabellenkopf

<br />In der HTML-Sprache können Sie der Tab...

Lösung für das Jitter-Problem beim CSS3-Transformationsübergang

transform: scale(); Skalierung verursacht Jitter ...

Gängige Angriffe auf Web-Frontends und Möglichkeiten, sie zu verhindern

Die Sicherheitsprobleme, die bei der Frontend-Ent...

Grundlegende Konzepte und allgemeine Methoden des Map-Mappings in ECMAScript6

Inhaltsverzeichnis Was ist eine Zuordnung? Unters...

Lombok-Implementierung JSR-269

Vorwort Einführung Lombok ist ein praktisches Too...