さて、C#でMySQLを操作するは、第7回目となりましたが今回で最後になります。
備忘録パートⅡの終わりなんですw
最終回となる今回は、『トランザクション』について説明していきたいと思います。
それでは、本題に入りましょう。
下表のような2つのテーブルがあるとします。
テーブル名: t_tanka
タイプ: InnnoDB
| 番号 (i_nbr) | 名称 (i_nme) | 単価 (i_tnk) |
| 1 | コーヒー | 150 |
| 2 | 紅茶 | 130 |
| 3 | 緑茶 | 120 |
テーブル名: t_zaiko
タイプ: InnnoDB
| 番号 (i_nbr) | 数量 (i_zik) |
| 1 | 50 |
| 2 | 30 |
| 3 | 40 |
そして、以下の新商品が入荷されました。
| 番号 (i_nbr) | 名称 (i_nme) | 単価 (i_tnk) | 数量 (i_zik) |
| 5 | ウーロン茶 | 120 | 20 |
このような場合に、入荷された商品の情報は、『t_tanka』及び『t_zaiko』の両方にデータを登録しなければなりません。『t_tanka』にデータが登録されても、『t_zaiko』への登録が正常に行われなかったら意味がないのです。
このような場合には、トランザクションを用いて処理の単位をひとくくりにしてやると良いでしょう。
まずは、サンプルコーディングをご覧になってみて下さい。
| // MySQL コネクション定義 MySqlConnection myConn; // 接続パラメータ設定 String strConn = "Database=sample;" + "Data Source=rhea.gaia.home;" + "User ID=sample;" + "Password=sample"; try { // MySQLへ接続 myConn = new MySqlConnection(strConn); // 接続を開く myConn.Open(); // キャラクタセット設定(シフトJIS) MySqlCommand myCom = new MySqlCommand("SET NAMES sjis", myConn); myCom.ExecuteNonQuery(); } catch (Exception ee) { MessageBox.Show(ee.Message, "Error"); return; } // MySQL トランザクション開始 MySqlTransaction myTrans = myConn.BeginTransaction(); // 単価テーブルへの挿入 // SQL 作成 String strSQL1 = "Insert Into t_tanka(i_nbr, i_nme, i_tnk) Values(5, \"ウーロン茶\", 120) "; try { // MySQL コマンド作成 MySqlCommand myCommand = new MySqlCommand(strSQL1, myConn); // データ挿入 if (myCommand.ExecuteNonQuery() == 1) { } else { myTrans.Rollback(); myConn.Close(); MessageBox.Show("データが正常に挿入されませんでした(1)", "Error"); return; } } catch (Exception ee) { myTrans.Rollback(); myConn.Close(); MessageBox.Show(ee.Message, "Error"); return; } // 在庫テーブルへの挿入 // SQL 作成 String strSQL2 = "Insert Into t_zaiko(i_nbr, i_zik) Values(5, 20) "; try { // MySQL コマンド作成 MySqlCommand myCommand = new MySqlCommand(strSQL2, myConn); // データ挿入 if (myCommand.ExecuteNonQuery() == 1) { } else { myTrans.Rollback(); myConn.Close(); MessageBox.Show("データが正常に挿入されませんでした(2)", "Error"); return; } } catch (Exception ee) { myTrans.Rollback(); myConn.Close(); MessageBox.Show(ee.Message, "Error"); return; } // トランザクションコミット myTrans.Commit(); // コネクションを閉じる myConn.Close(); |
それでは、順に見ていきましょう。
1) トランザクションの開始
MySqlTransaction トランザクション名 = コネクション名.BeginTransaction();
2) t_tanka テーブルへのデータ登録
ここで処理が失敗した場合には、これまでに行った処理を無かったものとするために巻き戻しをします
トランザクション名.Rollback();
3) t_zaiko テーブルへのデータ登録
ここで処理が失敗した場合には、これまでに行った処理を無かったものとするために巻き戻しをします
トランザクション名.Rollback();
4) 上記2) と3) の処理が正常に行われたなら、行われた処理を結果を確定いたします
トランザクション名.Commit();
どうでしょうか、これまでにやってまいりました、データ挿入と大きな違いはありませんよね。簡単に言いますと、データ挿入処理を、トランザクションの開始と確定で挟めばいいだけなのです。
※ 表示の都合上、"¥"記号が"\"記号で表示されておりますが実際には半角の"¥"記号になります。