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

Einige Parameterbeschreibungen von Texteingabefeldern im Webdesign

<br />In Gästebüchern, Foren und anderen Ort...

Detailliertes Tutorial zum Aufbau eines lokalen Ideenaktivierungsservers

Vorwort Der Blogger verwendet die Idea IDE. Da di...

Vue erzielt einen nahtlosen Karusselleffekt (Laufschrift)

In diesem Artikelbeispiel wird der spezifische Co...

jQuery implementiert einen Zeitselektor

In diesem Artikelbeispiel wird der spezifische Co...

So legen Sie das Breitenattribut auf den Stil des Span-Tags fest

Wenn Sie das Breitenattribut direkt auf den Stil d...

MySQL-Triggersyntax und Anwendungsbeispiele

Dieser Artikel veranschaulicht anhand von Beispie...

Vue implementiert einfache Rechnerfunktion

In diesem Artikelbeispiel wird der spezifische Co...

Vollständiges HTML des Upload-Formulars mit Bildvorschau

Das Upload-Formular mit Bildvorschaufunktion, der...

Detaillierte Erklärung der HTML-Programmier-Tags und der Dokumentstruktur

Der Zweck der Verwendung von HTML zum Markieren v...

Detaillierter Prozess der NTP-Serverkonfiguration unter Linux

Inhaltsverzeichnis 1. Umgebungskonfiguration 1.NT...

Detaillierte Erklärung zur Verwendung des CSS-Zeigerereignisse-Attributs

Bei der Frontend-Entwicklung stehen wir in direkt...