MySQL でトランザクションのコミットとロールバックを実装する方法の詳細な例

MySQL でトランザクションのコミットとロールバックを実装する方法の詳細な例

最近、データベース データのスケジュールされた移行を実行する必要があります。実行プロセス中に何らかの理由で SQL ステートメントがエラーを報告してデータ転送の混乱を引き起こすのを防ぐには、スクリプトのトランザクションを制御する必要があります。

まずtran_testテーブルを作成します

テーブルtran_testを作成します( 
f1 VARCHAR(10) NULLではない、 
f2 INT(1) デフォルト NULL、 
主キー (f1) 
)エンジン=INNODB 文字セット=utf8

tran_test に 2 つのデータを挿入したいのですが、挿入中にエラーが発生しないように、トランザクション内で挿入ステートメントを制御したいと思います。

この時、何人かの方の記事を確認すると、このような回答が返ってくることが多いです。

トランザクションを開始します。  
tran_test に VALUES('A',1) を挿入します。 
tran_test に VALUES('B',2) を挿入します。 
ロールバック;

または

トランザクションを開始します。  
tran_test に VALUES('A',1) を挿入します。 
tran_test に VALUES('B',2) を挿入します。 
専念;

これらの SQL ステートメントは非常に単純に見え、実際にコミットまたはロールバックできます。

しかし、これで本当に私たちの目標は達成できるのでしょうか?答えはノーです。

たとえば、最初の段落では、正しいかどうかに関係なく、トランザクション内のすべての SQL ステートメントが ROLLBACK されます。このような絶対的なロールバックにより、SQL は無意味になります。

したがって、トランザクションを真に制御したい場合、実行される SQL に対して異常検出を実行することが私の考えです。 SQL に例外がない場合は COMMIT、例外がキャッチされた場合は ROLLBACK します。

この時点で、例外をキャプチャするためのストアド プロシージャを構築する必要があります。実行が成功した場合は COMMIT が実行され、SQL 実行が失敗した場合は ROLLBACK が実行されます。

望む効果を得るには2つの方法があります。

1 つ目は、実行する SQL の例外をキャプチャすることです。変数 t_error を定義します。例外がキャプチャされたら、t_error=1 とします。次に、t_error の条件判断を行います。t_error=1 の場合は ROLLBACK を実行し、それ以外の場合は COMMIT を実行します。

存在する場合は t_test プロシージャを削除します。 
区切り文字 // 
プロシージャ t_test() を作成する 
 始める 
  t_error INTEGER を宣言します。 
  SQLEXCEPTION の CONTINUE ハンドラーを宣言し、t_error = 1 を設定します。 
  トランザクションを開始します。 
     tran_test に VALUES('A',1) を挿入します。 
   tran_test に VALUES('B',2) を挿入します。 
     t_error = 1の場合 
       ロールバック; 
     それ以外 
       専念; 
     終了の場合; 
終わり// 
t_test() を呼び出します。

もう1つは最初のものの簡略化であり、例外がキャッチされた場合はROLLBACKが直接実行され、例外がキャッチされない場合はCOMMITが直接実行されます。

存在する場合は t_test プロシージャを削除します。 
区切り文字 // 
プロシージャ t_test() を作成する 
始める 
SQLEXCEPTION ROLLBACK の終了ハンドラを宣言します。 
トランザクションを開始します。 
tran_test に VALUES('A',1) を挿入します。 
tran_test に VALUES('B',2) を挿入します。 
専念; 
終わり// 
t_test() を呼び出す

このようにして、2 つの挿入ステートメントは 1 つのトランザクション内で実際に制御されます。

今回は上記の例をテストしていただけます。その他の補足やご質問がある場合は、編集者に直接お問い合わせください。123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL でコミットされていないトランザクションを見つけるための SQL の例の簡単な分析
  • MySQL でコミットされていないトランザクション情報を見つける方法
  • Mysql トランザクション分離レベルの読み取りコミットの詳細な説明
  • MySQL の InnoDB テーブルの書き込み速度に対するインデックスとコミット頻度の影響を調べる
  • PHP がテキストエリアデータを MySQL に送信するときに多くのスペースが発生する問題の解決方法
  • MySQLはトランザクションのコミットとロールバックの例を実装しています
  • Python は MySQL に接続し、MySQL トランザクションの例を送信します
  • JSP + MySQL 中国語の文字化け問題 投稿投稿文字化けの解決方法
  • MySQLとSpringの自動コミットの詳細な説明

<<:  EclipseのプロジェクトをTomcatに追加できない問題を解決する方法

>>:  弾幕効果を実現するためのjQuery

推薦する

HTML の順序付きリスト、順序なしリスト、定義リストに関する簡単な説明

順序付きリストXML/HTML コードコンテンツをクリップボードにコピー<オルタイプ= &qu...

React-Native スクリーンショットコンポーネント react-native-view-shot の紹介と使い方のまとめ

目次1. 現象2. 解決策3. 要約: 1. 現象1. 要件: 特定の表示ページをキャプチャしてアル...

vue3 コンポーネントでの v-model の使用と詳細な説明

目次v-model 入力で双方向バインディングデータを使用するコンポーネント内の v-model他の...

JavaScript 配列のマージのケーススタディ

方法1: var a = [1,2,3]; var b = [4,5] b を連結します。 コンソー...

Docker-compose ネットワークの詳細な例

今日は Docker でのネットワーク設定を試し、後で忘れないようにプロセスを記録しました。 (シス...

VUE+CanvasはシンプルなGobangゲームの全プロセスを実現します

序文レイアウトの点では、Gobang はランダムな動きを目的とするゲームよりも実装がはるかに簡単で、...

シンプルなページング効果を実現するjQuery+Ajax

この記事では、ページング効果を実現するためのjquery+Ajaxの具体的なコードを参考までに紹介し...

jsは前のページに戻り、コードを更新します

1. Javascript は前のページ history.go(-1) に戻り、2 つのページを返し...

77.9K の GitHub リポジトリを持つ Axios プロジェクト: 学ぶ価値のあることは何でしょうか?

目次序文1. Axiosの紹介2. HTTPインターセプターの設計と実装2.1 インターセプターの紹...

LinuxでMySQLのリモートアクセス権を有効にし、ファイアウォールでポート3306を開きます。

mysqlのリモートアクセス権を有効にするデフォルトでは、MySQL ユーザーにはリモート アクセ...

MySQL でトランザクションのコミットとロールバックを実装する方法の詳細な例

最近、データベース データのスケジュールされた移行を実行する必要があります。実行プロセス中に何らかの...

Nginx設定ファイルの詳細な説明

Nginx の主な設定ファイルは nginx.conf で、グローバル ブロック、イベント ブロック...

uniapp アプレットでウォーターフォール フロー レイアウトを実装するためのアイデアとコード

1. はじめに今、ウォーターフォールフローについて書くことは、古い内容の焼き直しと見なされますか?気...

ReactのuseEffectクロージャの落とし穴についての簡単な説明

問題コードuseEffectによって発生したクロージャの問題コードを見てみましょう 定数 btn =...

フォームアクションとonSubmitの例

まず、action はフォームの属性です。HTML5 では必須の属性値として定義されています。onS...