mysql+mybatisはストアドプロシージャ+トランザクション+複数同時シリアル番号取得を実装します

mysql+mybatisはストアドプロシージャ+トランザクション+複数同時シリアル番号取得を実装します

データベースストアドプロシージャ

`generate_serial_number_by_date` が存在する場合はプロシージャを削除します。
プロシージャ `generate_serial_number_by_date` を作成します (
    IN param_key varchar(100)、
    IN param_org_id bigint、 
    IN param_period_date_format varchar(20)、 
      OUT結果bigint、
    出力 current_datestr varchar(20))
始める 

        old_datestr varchar(20) を宣言します。
        
        トランザクションを開始します。 

        param_period_date_format='infinite'の場合 
            current_datestr を '00000000' に設定します。
    それ以外
            current_datestr = DATE_FORMAT(NOW(), param_period_date_format) を設定します。
        終了の場合;
        
        選択 
                    数値、日付文字列 
        sys_serial_number から
        ここで、table_key = param_key 
                org_id = param_org_id です 
                そして、period_date_format = param_period_date_format
                結果に、old_datestr
                更新用;

        結果がnullの場合
            
            結果を 1 に設定します。
            
            sys_serial_number(table_key、org_id、period_date_format、datestr、number、description) に挿入します。 
                values(param_key、param_org_id、param_period_date_format、current_datestr、1、'プロシージャによる追加');
        
        そうでない場合、old_datestr != current_datestr then
            
            結果を 1 に設定します。
            
            sys_serial_number を更新 
                    番号を 1 に設定し、    
                            datestr = 現在の日付文字列 
            ここで、table_key = param_key 
                    org_id = param_org_id です 
                    かつ period_date_format = param_period_date_format;
            
        終了の場合;
        
        sys_serial_numberを更新し、number = number + 1を設定します。 
            ここで、table_key = param_key 
                org_id = param_org_id です 
                かつ period_date_format = param_period_date_format;
    専念;
終わり

シリアル番号表

`sys_serial_number` が存在する場合はテーブルを削除します。
テーブル `sys_serial_number` を作成します (
  `table_key` varchar(100) NOT NULL COMMENT '主キー(テーブル名を推奨)',
  `org_id` bigint(20) NOT NULL デフォルト '0' コメント 'ブランチID',
  `number` bigint(20) NOT NULL DEFAULT '1' COMMENT 'シリアル番号(ストアドプロシージャによって増加、取得後に+1)',
  `period_date_format` varchar(20) NOT NULL COMMENT 'シリアル番号生成期間の日付形式',
  `datestr` varchar(20) DEFAULT NULL COMMENT 'シリアル番号の日付値',
  `description` varchar(100) デフォルト NULL コメント '説明',
  主キー (`table_key`,`org_id`,`period_date_format`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='シリアル番号生成テーブル';

mybatisの設定

<select id="generateSerialNumber" パラメータタイプ="java.util.HashMap" ステートメントタイプ="CALLABLE">
    <![CDATA[
           {
           generate_serial_number を呼び出す (
            #{param_key,mode=IN,jdbcType=VARCHAR},
            #{param_org_id,mode=IN,jdbcType=BIGINT},
            #{結果、モード=OUT、jdbcType=BIGINT}
            )
           }
       ]]>
  </選択>

テストコード

@オーバーライド
    パブリック Map<String, Object> generateSerialNumber(Map<String, Object> param) {
        sysSerialNumberMapper.generateSerialNumber(パラメータ);
        パラメータを返します。
    }
最終的な Map<String, Object> パラメータ = 新しい HashMap<String, Object>();
        param.put("param_key","契約");
        param.put("param_orgId", 84);
        新しいスレッド(新しい実行可能() {
            @オーバーライド
            パブリックボイド実行(){
                (int i =0; i<100; i++) の場合 {
                    Map<String, Object> map = serialNumberProvider.generateSerialNumber(param);
                    System.out.println("スレッド1: " + map.get("結果"));
                }
            }
        })。始める();

        新しいスレッド(新しい実行可能() {
            @オーバーライド
            パブリックボイド実行() {
                (int i =0; i<100; i++) の場合 {
                    Map<String, Object> map = serialNumberProvider.generateSerialNumber(param);
                    System.out.println("スレッド2: " + map.get("結果"));
                }
            }
        })。始める();

        新しいスレッド(新しい実行可能() {
            @オーバーライド
            パブリックボイド実行() {
                (int i =0; i<100; i++) の場合 {
                    Map<String, Object> map = serialNumberProvider.generateSerialNumber(param);
                    System.out.println("スレッド3: " + map.get("結果"));
                }
            }
        })。始める();

        バイト[] b = 新しいバイト[0];
        同期(b) {
            b.wait();
        }

コードを実行して次のエラーが発生した場合

### SQL:
{
generate_serial_number_by_date を呼び出す (
?、?、?、?、?

}
### 原因: java.sql.SQLException: パラメータ番号 4 は OUT パラメータではありません
; SQL []; パラメータ番号 4 は OUT パラメータではありません。ネストされた例外は java.sql.SQLException です: パラメータ番号 4 は OUT パラメータではありません

トラブルシューティング方法:

1. ストアドプロシージャが正しく作成されているかどうかを確認する

2. データソース接続ユーザーにストアドプロシージャ実行権限があるかどうかを確認します。

これで、mysql+mybatis によるストアド プロシージャ + トランザクション + 複数同時シリアル番号取得の実装に関するこの記事は終了です。mysql mybatis ストアド プロシージャ シリアル番号に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL トランザクション機能を使用して同時かつ安全な自動増分 ID を実装する例
  • PHP+MySQL の高同時ロックトランザクション処理問題の解決方法
  • MySQL の繰り返し読み取りレベルでファントム読み取りを解決できますか?
  • MySQLがファントムリードを解決する方法の詳細な説明
  • MySQL トランザクション同時実行問題の解決
  • MySQL ファントムリードとその排除方法の詳細な説明
  • MySQL シリーズ 10 同時実行制御を実装するための MySQL トランザクション分離
  • MySQL のファントムリード問題を解決する方法
  • Mysql トランザクションにおける同時ダーティ リード + 非反復リード + ファントム リードの詳細な説明

<<:  完璧なアロエベラジェルを選ぶには?完璧なアロエベラジェルの本物と偽物の見分け方

>>:  CSS3で作成した画像スクロール効果

推薦する

CSS フロントエンドの知識ポイントのまとめ(必読)

1. CSS の概念: (カスケーディング スタイル シート)利点: 1. コンテンツとプレゼンテ...

MySQL最新バージョン8.0.17解凍版インストールチュートリアル

個人的にはインストール版よりも解凍版の方がインストールしやすいと思います。早速、解凍版のインストール...

単一の Nginx IP アドレスに複数の SSL 証明書を設定する例

デフォルトでは、Nginx は IP アドレスごとに 1 つの SSL 証明書のみをサポートします。...

MySQLデータベースのストアドプロシージャとトランザクションの違い

トランザクションは、複数の SQL ステートメントの原子性、つまり、それらが一緒に完了するか、一緒に...

ウェブフロントエンドに対する一般的な攻撃とその防止方法

ウェブサイトのフロントエンド開発で発生するセキュリティ問題は、クライアントブラウザで実行されるコード...

安全な構成のためにDockerでTLSを有効にする手順

序文以前、Docker の 2375 Remote API を有効にしていました。会社のセキュリティ...

win2008 で mysql8.0.11 を mysql8.0.17 にアップグレードする詳細な手順

アップグレードの背景: MySQLの下位バージョンの脆弱性を解決するために、MySQLはMySQL ...

CSSでemを開く正しい方法の詳細な説明

「通常 1em=16px」と言うのはなぜですか?ユーザーのブラウザによってレンダリングされるデフォル...

Linuxの一般的なコマンドでLinuxのmoreコマンドを使用する方法

more は、最もよく使用されるツールの 1 つです。最も一般的な使用方法は、出力コンテンツを表示し...

JavaScript ベースのランダム点呼システムの実装

この記事では、ランダムロールコーラーを実装するためのJavaScriptの具体的なコードを参考までに...

Windows はリモート デスクトップが長時間自動的に切断されるのを防ぎます

Windows リモート デスクトップを使用してサーバーに接続したことがある人なら、リモート デスク...

ChromeとIEに対応したWMPに埋め込まれたHTMLの詳細な紹介

実際には、対応する記述方法は多数ありますが、最も一般的なのは object + embedded で...

CSS3は光る境界線効果を実現します

操作効果: html <!-- この要素は表示されません。DOM は JavaScript に...

VMware 仮想マシンに Android x86 をインストールする方法

アプリをテストしたいが、それを携帯電話で実行したくない場合があります。この場合、仮想マシンを使用して...

MySQL 5.7.13 のインストールと設定方法のグラフィック チュートリアル (win10 64 ビット)

この記事では、参考までにMySQL 5.7.13 winx64のインストールと設定方法のグラフィック...