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

js objektorientierte Methode zum Erzielen eines Drag-Effekts

In diesem Artikel wird der spezifische Code zur I...

Grundlegende Verwendung des Befehls wget unter Linux

Inhaltsverzeichnis Vorwort 1. Laden Sie eine einz...

Lösung für das MySQL-Fehlerproblem 1045 (28000)

Ich bin auf den MySQL-FEHLER 1045 gestoßen und ha...

So fügen Sie Div-Elementen abgerundete Ränder hinzu

Wie unten dargestellt: CSS- CodeInhalt in die Zwi...

Kennen Sie die Bedeutung von Sonderzeichen in URLs?

1.# # stellt eine Position auf einer Webseite dar...

Tutorial zur HTML-Tabellenauszeichnung (37): Hintergrundbild-Attribut BACKGROUND

Legen Sie das Hintergrundbild für die Tabellenübe...

MySQL-Sortierung – Chinesische Details und Beispiele

Detaillierte Erklärung zur MySQL-Sortierung chine...

So installieren Sie die MySQL 8.0-Datenbank auf dem M1-Chip (Bild und Text)

1. Herunterladen Zunächst möchte ich einen inländ...

So verwenden Sie vue3+TypeScript+vue-router

Inhaltsverzeichnis Einfach zu bedienen Erstellen ...

MySQL SHOW PROCESSLIST unterstützt den gesamten Prozess der Fehlerbehebung

1. SHOW PROCESSLIST-Befehl SHOW PROCESSLIST zeigt...

Detaillierte Erklärung der MySQL-Partitionstabelle

Vorwort: Partitionierung ist ein Tabellenentwurfs...

Beispiele für häufige Nginx-Fehlkonfigurationen

Inhaltsverzeichnis Fehlender Stammspeicherort Off...