トランザクションは、論理作業単位に結合されたデータベース操作のグループであり、システムでエラーが発生する可能性があるにもかかわらず、各データベースの整合性と整合性を制御および維持するために使用されます。 トランザクションは、一連の SQL SELECT、INSERT、UPDATE、または DELETE ステートメントで構成されます。 トランザクション中にエラーが発生しない場合、トランザクション内のすべての変更はデータベースの永続的な部分になります。 エラーが発生した場合、データベースに対する変更は行われません。
トランザクションは、単一フェーズであり、データベースによって直接処理される場合、ローカル トランザクションと見なされます。 トランザクションは、トランザクション モニターによって調整され、トランザクション解決にフェールセーフ メカニズム (2 フェーズ コミットなど) を使用する場合、分散トランザクションと見なされます。
注
トランザクションは、サーバー上で実行するのが最も効率的です。 明示的なトランザクションを広範に使用する SQL Server データベースを使用する場合は、Transact-SQL BEGIN TRANSACTION ステートメントを使用してストアド プロシージャとして記述することを検討する必要があります。
MsDb2Connection
オブジェクトを使用してトランザクションを制御します。 ローカル トランザクションは、BeginTransaction
メソッドを使用して開始できます。 トランザクションを開始したら、MsDb2Command
オブジェクトの Transaction
プロパティを使用して、そのトランザクションにコマンドを参加させることができます。 次に、トランザクションの内容が成功したか失敗したかに基づいて、データ ソースに対する変更をコミットまたはロールバックします。
トランザクションには、BEGIN、COMMIT、ROLLBACK の 3 つの基本的なコマンドがあります。 BEGIN ステートメントは、トランザクションの先頭を示します。 BEGIN ステートメントの後に試行されたすべてのプロシージャーは、COMMIT ステートメントによって完了されたトランザクションの一部と見なされるか、ROLLBACK ステートメントによって取り消されます。
トランザクションを実行するには
トランザクションの開始をマークする
MsDb2Connection.BeginTransaction
を呼び出します。BeginTransaction
はトランザクションへの参照を返します。 トランザクションに参加しているコマンドに割り当てることができるように、この参照を保持します。実行する
MsDb2Command.Transaction
にトランザクションを割り当てます。アクティブなトランザクションとの接続でコマンドが実行され、
Command
のTransaction
プロパティにTransaction
オブジェクトが割り当てられていない場合は、MsDb2Exception
がスローされます。必要なコマンドを実行します。
MsDb2Transaction.Commit
を呼び出してトランザクションを完了するか、MsDb2Transaction.Rollback
を呼び出してトランザクションを取り消します。Commit
またはRollback
メソッドが実行される前に接続が終了または破棄されると、トランザクションはロールバックされます。次のコード例は、トランザクションを実行する方法を示しています。
static void TransactionConnection()
{
MsDb2Connection myConnection new MsDb2Connection(@"file name=HOST.udl ");
myConnection.Open();
// Start a local transaction.
MsDb2Transaction myTrans = myConnection.BeginTransaction();
// Enlist the command in the current transaction.
MsDb2Command myCommand = myConnection.CreateCommand();
myCommand.Transaction = myTrans;
try
{
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
myCommand.ExecuteNonQuery();
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
myCommand.ExecuteNonQuery();
myTrans.Commit();
Console.WriteLine("Both records are written to database.");
}
catch(Exception e)
{
try
{
myTrans.Rollback();
}
catch (MsDb2Exception ex)
{
if (myTrans.Connection != null)
{
Console.WriteLine("An exception of type " + ex.GetType() +
" was encountered while attempting to roll back the transaction.");
}
}
Console.WriteLine("An exception of type " + e.GetType() +
"was encountered while inserting the data.");
Console.WriteLine("Neither record was written to database.");
}
finally
{
Console.ReadLine();
myConnection.Close();
}
}
// End TransactionConnection