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経由でホストマシンにアクセスできない問題を解決する方法の詳細な説明

推薦する

MySQL データベースは何をしますか?

MySQL はリレーショナル データベース管理システムです。リレーショナル データベースは、すべて...

HTML テーブル タグ チュートリアル (34): 行スパン属性 ROWSPAN

複雑なテーブル構造では、一部のセルが水平方向に複数のセルにまたがるため、行間属性 ROWSPAN を...

Alibaba Cloud ECS サーバーでポート 8080 を開く方法

セキュリティ上の理由から、Alibaba Cloud Server ECS にはデフォルトで独自のセ...

ユーザーのニーズがマーケティング指向のデザインにつながる

<br />それぞれのトピックについて、チーム内でメールで議論します。議論が白熱するにつ...

クリック範囲を拡大する入力チェックボックスを実装する方法

XML/HTML コードコンテンツをクリップボードにコピー< div style = &quo...

MongoDB の起動エラーを解決します: 共有ライブラリのロード中にエラーが発生しました: libstdc++.so.6: 共有オブジェクト ファイルを開けません:

MongoDB を起動すると、プロンプトは次のようになります。共有ライブラリのロード中にエラーが発...

geo モジュールを使用して Nginx でホワイトリストを設定する例

元の構成: http { ...... limit_conn_zone $binary_remote...

スクロールバーの美化効果を実現するための CSS3 のサンプル コード

具体的なコードは次のとおりです。 /*スクロールバーの幅*/ ::-webkit-スクロールバー{ ...

CMD で MySQL データベースを操作するときに中国語の文字化けが発生する問題の解決方法

Baiduで検索しました。 。 chcp コマンドを使用して、cmd の文字エンコーディングを 65...

MySql キャッシュ クエリの原理とキャッシュ監視およびインデックス監視の概要

クエリキャッシュ1. クエリキャッシュの動作原理クエリ ステートメントを実行する前に、MySQL は...

VMware 仮想マシン (CentOS7 イメージ) を使用して Linux をインストールする

1. VMwareのダウンロードとインストールリンク: https://www.jb51.net/s...

MySQL 5.7 zip アーカイブ バージョンのインストール チュートリアル

この記事では、MySQL 5.7 zipアーカイブ版のインストールチュートリアルを参考までに紹介しま...

単一の MySQL テーブルで数千万のデータを処理するアイデアを共有する

目次プロジェクトの背景改善案データ特性を観察するマルチプロセスアイデアの要約データ処理スキルプロジェ...

Vue で lodop 印刷コントロールを使用してブラウザ互換の印刷を実現する方法

序文このコントロールを直接印刷すると下部に透かしが入りますが、公式 Web サイトから購入することで...

Dockerは同じIPネットワークセグメントとの接続を実現する

最近、Docker とホストが同じネットワーク セグメント上で通信する問題を解決し、そのプロセス全体...