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

Beispielcode zur Implementierung einer QR-Code-Scanbox mit CSS

Normalerweise haben wir ein Scan-Feld, wenn wir d...

Lösungen für das Problem der Erstellung von XHTML- und CSS-Webseiten

Die Lösungen für die Probleme, die bei der Erstell...

Detailliertes Installationstutorial für Windows 10 + MySQL 8.0.11 Zip

Vorbereiten: Downloadadresse für das MySQL 8.0 Wi...

Methoden und Probleme zum Festlegen des HTML-Zeilenabstands

Um den Zeilenabstand von <p></p> festz...

MYSQL METADATA LOCK (MDL LOCK) MDL-Sperrproblemanalyse

1. Einleitung MDL-Sperren in MySQL haben schon im...

MySQL 8.0.16 Installations- und Konfigurations-Tutorial unter CentOS7

Deinstallieren Sie die alte MySQL-Version (übersp...

So importieren Sie CSS-Stile in externe HTML-Stylesheets

Der Link-In-Stil besteht darin, alle Stile in ein...

Detaillierte Erklärung des CSS3-Rotationswürfelproblems

3D-Koordinatenkonzept Wenn sich ein Element dreht...

Ausführliche Erläuterung des MySQL-Gemeinschaftsindex und des eindeutigen Index

Szenario 1. Pflegen Sie ein Bürgersystem mit eine...

Detailliertes Tutorial zum verteilten Betrieb von JMeter in der Docker-Umgebung

1. Erstellen Sie das Basisimage von jmeter Das Do...