Mysqlトランザクション操作の失敗を解決する方法

Mysqlトランザクション操作の失敗を解決する方法

Mysqlトランザクション操作の失敗を解決する方法

トランザクションの原子性: トランザクションは、データベース内の論理的な作業単位です。トランザクションに含まれるすべての操作は、実行されるか、実行されないかのいずれかになります。

トランザクションの原子性を実現するには、単一のコミット コマンドまたはロールバック コマンドだけでは不十分です。これは、たとえば、コミット コマンドでは、トランザクション内で正常に実行された DML ステートメントのみがデータベースに送信されるためです。トランザクションのアトミック性を実現するには、プログラム内のビジネス ロジックと組み合わせて、コミット コマンドとロールバック コマンドを使用する必要があります。具体的なビジネス ロジック コードは次のとおりです。

1. 現象

プログラム内で挿入のためのトランザクションが開かれていますが、コミットされていません。テーブルにはすでにデータが存在しており、ロールバックしても挿入されたデータは削除できません。

2. 理由

このテーブルのストレージエンジンは innoDB ではなく myisam であり、トランザクション ロールバック () をサポートしていません。

3. 解決策

alter table xxxx engine = innoDB; を使用してテーブルを InnoDB エンジンに変更すると、ロールバックは正常になります。

4. コード

 プライベートvoid testCrud() {
     Connection conn = null; //接続オブジェクト PreparedStatement pstmt = null; //プリコンパイルされたSQLステートメントオブジェクト try{
        //MySQL ドライバーをロードします Class.forName("com.mysql.jdbc.Driver");
        //接続文字列 String url = "jdbc:mysql://localhost:3306/test";
        //データベース接続を確立します。conn = DriverManager.getConnection(url,"root","");
        //トランザクション分離レベルを設定します // conn.setTransactionIsolation(Connection. TRANSACTION_REPEATABLE_READ);
        //自動コミットを false に設定し、トランザクションを開始します。conn.setAutoCommit(false);
        // パラメータを使用してステートメントを更新します String sql = "INSERT INTO user_info (username ,password ,age )values(?,?,?)";
        //ステートメントを準備します pstmt = conn.prepareStatement(sql);
        //パラメータをバインドし、更新ステートメントを実行して、Zhang San の口座残高から 1000 元を減算します。pstmt.setString(1, "zhangui");
        pstmt.setString(2, "1111");
        pstmt.setInt(3, 300);
        pstmt.execute();
        
        //パラメータをバインドし、更新ステートメントを実行して、Li Si のアカウントの残高を 1,000 元増加します// pstmt.setString(1, "zzzzzzzzzzzzzzzzzz"); //不正なパラメータがバインドされています//pstmt.setString(2, "1111111111");
        //pstmt.setInt(3, 500);
        //pstmt.execute(); //SQL 例外がスローされます //トランザクションをコミットします //conn.commit();
        System.out.println("トランザクションが送信されました。転送は成功しました!");
        //ステートメント、接続を閉じます pstmt.close(); conn.close();
      }例外eをキャッチする{
        試す{
          conn.rollback(); //トランザクションをロールバックする System.out.println("トランザクションは正常にロールバックされました。レコードは更新されませんでした!");
        }catch(例外再){
          System.out.println("ロールバックトランザクションに失敗しました!");
        }
        e.printStackTrace();
      }ついに{
        if(pstmt!=null) try{pstmt.close();}catch(例外を無視){}
        if(conn!=null) try{conn.close();}catch(例外を無視){}
      }
    
  }

読んでいただきありがとうございます。お役に立てれば幸いです。このサイトをサポートしていただきありがとうございます。

以下もご興味があるかもしれません:
  • Mysqlトランザクション処理の詳細な説明
  • MySQL の 4 つのトランザクション分離レベルを例を使って分析する
  • Mysql トランザクション ログとログ ファイルが大きすぎて縮小できないという問題を解決します。
  • MySQL ストアド プロシージャ、カーソル、トランザクションの例の詳細な説明
  • PHP mysqli トランザクション操作の一般的な方法の分析
  • MySQL の 4 つのトランザクション分離レベルの詳細な説明
  • NodeJs は MySQL モジュールを使用してトランザクション処理の例を実装します
  • MySQLデータベースのトランザクション分離レベルの詳細な説明
  • MySQLトランザクションの基本的な学習と経験の共有

<<:  Reactはラジオコンポーネントのサンプルコードを実装します

>>:  dockerコンテナがIP経由でホストマシンにアクセスできない問題を解決する方法の詳細な説明

推薦する

vue-cropperプラグインは、画像キャプチャとアップロードコンポーネントのカプセル化を実現します。

vue-cropperプラグインをベースにした画像キャプチャとアップロードコンポーネントをカプセル...

Oracle Rownum 書き込みに似た MySQL の詳細な例

Rownum は、Oracle での独自の書き込み方法です。Oracle では、rownum を使用...

MySQLの明示的な型変換の簡単な分析

CAST関数前回の記事では、型変換を表示するために使用する CAST 関数について説明しました。暗黙...

MySQLのlike演算子の詳細

1. はじめに不明な値または部分的に既知の値をフィルタリングする場合は、like 演算子を使用でき...

HTML タグの表示モード (ブロックレベル タグ、インライン タグ、インライン ブロック タグ) に関する簡単な説明

今日の講義では、HTML におけるタグの表示モードについてお話ししましたが、これはブロックレベルタグ...

dockerにmysqlをインストールした後にNavicatが接続できない問題に対する完璧な解決策

1. Dockerがイメージをプルするdocker pull mysql (デフォルトで最新バージョ...

sqlite3 から mysql に移行するときに起こりうる問題のコレクション

簡単な説明適切な読者: モバイル開発sqlite3 データを mysql に移行する場合、多くの構文...

MySQL 8.0.15 のインストールと設定方法のグラフィックチュートリアル (Win10 Home バージョン 64)

超初心者の私は、MySQL を学び始めたばかりで、インストール プロセス中に多くの問題に遭遇しました...

HTML における水平および垂直の中央揃え方法の詳細な説明 (基礎)

序文馬を書いていたとき、水平方向と垂直方向の中央揃えの方法について、誰もあまり知らなかったと思います...

HTML の rel 属性の分析

.y { background: url(//img.jbzj.com/images/o_y.pn...

MySQLの不合理なMaxIdleConnsにより接続が短くなる

1 背景最近、Shimo Document のオンライン ビジネスでパフォーマンスの問題が発生しまし...

SMS送信のカウントダウンを実装するJavaScript

この記事では、SMS送信のカウントダウンを実装するためのJavaScriptの具体的なコードを参考ま...

MySQLオンラインDDL gh-ostの使用の概要

背景: DBA として、大規模なテーブルの DDL 変更のほとんどは、Percona の pt-on...

Tomcat メモリ オーバーフロー問題の解決経験

少し前に、製品バージョンをテスト用にテスターに​​提出したのですが、テスト結果はまったく予想外のもの...

Vue で配列をクリアするいくつかの方法 (要約)

目次1. はじめに2. データを消去するいくつかの方法2.1 ref() の使用2.2 スライスの使...