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(例外を無視){} } } 読んでいただきありがとうございます。お役に立てれば幸いです。このサイトをサポートしていただきありがとうございます。 以下もご興味があるかもしれません:
|
<<: Reactはラジオコンポーネントのサンプルコードを実装します
>>: dockerコンテナがIP経由でホストマシンにアクセスできない問題を解決する方法の詳細な説明
1. ダウンロードダウンロードアドレス: https://dev.mysql.com/get/Dow...
目次水波効果実装を見てみましょう水の波紋のデフォルトスタイルをカスタマイズする水の波紋の位置と直径を...
#mysql -uroot -pパスワードを入力してくださいmysql> show full...
コードをコピーコードは次のとおりです。 <選択> <オプション値="&q...
プロジェクトシナリオ:ページ表示には <ul> タグがあります。リストデータを動的に表示...
目次標準コミットメッセージの重要性コミットするコミットリント依存関係をインストールする.commit...
1. 背景LDAP を使用して、操作および保守に関連するユーザー名とパスワードを集中管理します。 1...
序文最近、小さなプログラムを開発しているときに、このような問題に遭遇しました。ユーザーが認証をクリッ...
カスケードを制御するために CSS の任意のプロパティに割り当てることができる特別な値が 2 つあり...
JSはショッピングカート内の商品の合計金額を計算して参考とします。具体的な内容は以下のとおりです。質...
目次序文1. SCPの使用法2. sftpを使用する3. scp と sftp の違いは何ですか?ど...
DIV+css構造 CSSレイアウトを学んでいますか?まだ純粋な CSS レイアウトを完全に習得でき...
Linux に Node.js をインストールする方法は 2 つあります。1 つは簡単で、解凍して使...
以下のコンテンツのオペレーティング システムは次のとおりです: Centos 6.7 yum で M...
以前は、境界線の長さをコンテナーよりも小さくする必要があったときに、div ネストを使用していました...