トランザクションの種類
Microsoft SQL Server Compact では、明示的なトランザクションと自動コミット トランザクションの 2 種類のトランザクションがサポートされています。
明示的なトランザクション
明示的なトランザクションは、トランザクションの開始と終了の両方をユーザーが明示的に定義するものです。これは、SQL ステートメントまたはデータベース API 関数のいずれかを使用して指定できます。
SQL ステートメント
Visual Studio を使用することで、以下の SQL ステートメントを使用して明示的なトランザクションを定義できます。
BEGIN TRANSACTION
接続の明示的なトランザクションの開始位置をマークします。
COMMIT TRANSACTION
エラーが発生していなければ、トランザクションを正常に終了します。トランザクションによって変更されたすべてのデータは、データベースの不変の部分になります。トランザクションで保持されていたリソースが解放されます。
ROLLBACK TRANSACTION
エラーが発生したトランザクションを消去します。トランザクションによって変更されたすべてのデータは、トランザクションの開始時の状態に戻されます。トランザクションで保持されていたリソースが解放されます。
ADO.NET と OLE DB
明示的なトランザクションは、ADO.NET と OLE DB でも使用できます。
ADO.NET では、SqlCeConnection オブジェクトで BeginTransaction メソッドを使用して、明示的なトランザクションを開始します。トランザクションを終了するには、SqlCeTransaction オブジェクトの Commit メソッドまたは Rollback メソッドを呼び出します。
OLE DB では、ITransactionLocal::StartTransaction メソッドを呼び出してトランザクションを開始します。fRetaining が FALSE に設定された状態で ITransaction::Commit メソッドまたは ITransaction::Abort メソッドを呼び出すと、自動的に別のトランザクションを開始することなく、トランザクションを終了します。1 つの ADO.NET 接続に複数のトランザクションを作成し、個別のコマンドに割り当てることができます。
重要
ADO.NET API を使用してトランザクションをコミットする場合は、トランザクション内のすべての開いたデータ リーダーと結果セットを閉じる必要があります。
自動コミット トランザクション
自動コミット モードは、SQL Server Compact の既定のトランザクション管理モードです。すべての SQL ステートメントは、完了時にコミットまたはロールバックされます。この既定のモードが明示的なトランザクションによってオーバーライドされていない場合は必ず、SQL Server Compact 接続は自動コミット モードで実行されます。ADO.NET と OLE DB の既定のモードも自動コミット モードです。
BEGIN TRANSACTION ステートメントにより明示的なトランザクションが開始されるまで、SQL Server Compact 接続は自動コミット モードで実行されます。明示的なトランザクションがコミットまたはロールバックされると、SQL Server Compact は自動コミット モードに戻ります。
コンパイルとランタイム エラー
SQL Server とは異なり、SQL Server Compact ではステートメントはバッチ処理されません。SQL Server Compact では、ステートメントを一度に 1 つずつ処理し、各ステートメントを個別に実行します。特定のステートメントで返されたエラーは、そのバッチに含まれるその他のステートメントには影響しません。たとえば、Visual Studio を使用して SQL Server Compact で以下の一連のクエリを実行した場合、最初の 2 つのクエリは成功しますが、3 番目のクエリは構文エラーが原因で失敗します。
CREATE TABLE TestData (col int);
INSERT INTO TestData VALUES (1);
INSERTT INTO TestData VALUES (1);
注意
これらのクエリがバッチとして SQL Server に送信された場合、クエリがまとめて解析されるので、すべて失敗します。構文エラーが発生すると、SQL Server でバッチの実行プランは構築されません。
操作を実行中の上位のトランザクションでは、トランザクションがロールバックされることもコミットされることもありません。