SQLを3つ発行し、3つ目で間違った場合は1個目、2個目は処理をキャンセルさせないと矛盾が発生してしまいます。
そこで、全てのSQLをキャンセルするという処理が必要になるのですが、この複数のスクリプトで1個の処理を表す事をトランザクションといいます。
トランザクションは次の流れで処理されます。
-----------------------
トランザクションの開始
SQL1を実行
SQL2を実行
SQL3を実行
トランザクションを終了
---------------------
トランザクションの終了で初めてデータベースに反映されます。これをコミットといいます。
途中でエラーが発生した場合にキャンセルする事をロールバックといいます。
では、C#でこれを実装するには、次の様にコーディングします。
------------------------
using(System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(Data Source=(local);Initial Catalog=MySample;Integrated Security=True)){
con.Open();
System.Data.SqlClient.SqlTransaction tr = null;
tr = con.BeginTransaction();
System.Data.SqlCommand com = new System.Data.SqlCommand();
com.Connection = con;
com.Transaction = tr;
try {
com.CommandText = "INSERT INTO(SampleCode, GropuCode) VALUES('Sample1', 'Group1')";
com.ExecuteNonQuery();
com.CommandText = "INSERT INTO(SampleCode, GropuCode) VALUES('Sample2', 'Group1')";
com.ExecuteNonQuery();
com.CommandText = "INSERT INTO(SampleCode, GropuCode) VALUES('Sample3', 'Group1')";
com.ExecuteNonQuery();
}
catch(Exception ex){
if (tr != null){
tr.Rollback();
tr.Dispose();
tr = null;
}
Console.WriteLine(ex);
}
finally
{
// 正常の場合はコミット
if(tr != null)
{
tr.Commit();
tr.Dispose();
tr = null;
}
}
}
------------------------
コネクションを開いて、コネクションにトランザクションの開始を命令します。
トランザクションを、コマンドを発行するオブジェクトにセットします。
(コネクションも一緒に)
トライ、キャッチでエラーが発生した際の処理を記述します。
エラーが発生し、トランザクションがnullでなければ、ロールバックを行います。
処理が完了した際にトランザクションがnullでなければ、ロールバックも発生していないので、正常とみなしコミットを行います。
これで、一つだけINSERTが失敗しても、全てキャンセルされるので、成功=3つのレコードが追加という保証がされます。
このように、成功か無かの状態を保つことをACID特性といいます。
ココら辺の事を、細かに説明すると本が1冊できてしまうくらいなので、もっと詳しくテクノロジーを知りたい場合は
.NETエンタープライズWebアプリケーション開発技術大全〈Vol.5〉トランザクション設計編 (マイクロソフトコンサルティングサービステクニカルリファレンスシリーズ―Microsoft.net)/赤間 信幸
¥4,095
Amazon.co.jp
この本がお勧めです。(SQLServerを基本に話してますが)
.NETエンタープライズWebアプリケーション開発技術大全のシリーズは結構重宝します。
.netでWEBアプリを作る方は見ておく事をお勧めします。