Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - プログラミング » SQL Anywhere データ・アクセス API » SQL Anywhere .NET データ・プロバイダ

 

Transaction 処理

SQL Anywhere .NET データ・プロバイダでは、SATransaction オブジェクトを使用して文をグループ化できます。各トランザクションは COMMIT または ROLLBACK で終了します。これらは、データベースの変更内容を確定したり、トランザクションのすべてのオペレーションをキャンセルしたりします。トランザクションが完了したら、さらに変更を行うための SATransaction オブジェクトを新しく作成する必要があります。この動作は、COMMIT または ROLLBACK を実行した後もトランザクションが閉じられるまで持続する ODBC や Embedded SQL とは異なります。

トランザクションを作成しない場合、デフォルトでは、SQL Anywhere .NET データ・プロバイダはオートコミット・モードで動作します。挿入、更新、または削除の各処理後には COMMIT が暗黙的に実行され、オペレーションが完了すると、データベースが変更されます。この場合、変更はロールバックできません。

SATransaction オブジェクトの詳細については、SATransaction クラスを参照してください。

トランザクションの独立性レベルの設定

デフォルトでは、トランザクションに対してデータベースの独立性レベルが使用されます。ただし、トランザクションを開始するときに IsolationLevel プロパティを使用してトランザクションに対して独立性レベルを指定できます。独立性レベルは、トランザクション内で実行されるすべての文に対して適用されます。SQL Anywhere .NET データ・プロバイダは、スナップショット・アイソレーションをサポートしています。

独立性レベルの詳細については、独立性レベルと一貫性を参照してください。

SELECT 文を入力するときに使用されるロックは、トランザクションの独立性レベルによって異なります。

ロックと独立性レベルの詳細については、クエリ時のロックを参照してください。

次の例では、SQL 文を発行してロールバックする SATransaction オブジェクトを使用します。このトランザクションは独立性レベル 2 (RepeatableRead) を使用します。この場合、修正対象のローに対して書き込みロックをかけて、他のデータベース・ユーザがこのローを更新できないようにします。

♦  SATransaction オブジェクトを使用して文を発行するには、次の手順に従います。
  1. SAConnection オブジェクトを宣言して初期化します。

    SAConnection conn = new SAConnection(
        "Data Source=SQL Anywhere 11 Demo" );
  2. 接続を開きます。

    conn.Open();
  3. Tee shirts の価格を変更する SQL 文を発行します。

    string stmt = "UPDATE Products SET UnitPrice =
        2000.00 WHERE name = 'Tee shirt'";
  4. Command オブジェクトを使用して SQL 文を発行する SATransaction オブジェクトを作成します。

    トランザクションを使用して独立性レベルを指定できます。この例では、独立性レベル 2 (RepeatableRead) を使用して、他のデータベース・ユーザがローを更新できないようにします。

    SATransaction trans = conn.BeginTransaction(
        IsolationLevel.RepeatableRead );
    SACommand cmd = new SACommand( stmt, conn,
        trans );
    int rows = cmd.ExecuteNonQuery();
  5. 変更内容をロールバックします。

    trans.Rollback();

    SATransaction オブジェクトを使用して、データベースの変更内容をコミットまたはロールバックできます。トランザクションを使用しない場合、.NET データ・プロバイダはオートコミット・モードで動作し、データベースの変更内容をロールバックできません。変更内容を確定するには、次のコードを使用します。

    trans.Commit();
  6. SAConnection オブジェクトを閉じます。

    conn.Close();
分散トランザクション処理

.NET 2.0 フレームワークで、トランザクション・アプリケーションを記述するためのクラスが含まれる新しいネームスペース System.Transactions が導入されました。クライアント・アプリケーションで 1 つまたは複数の参加者が存在する分散トランザクションを作成し、そのトランザクションに参加できます。クライアント・アプリケーションでは、TransactionScope クラスを使用して、暗黙的にトランザクションを作成できます。接続オブジェクトでは、TransactionScope によって作成されたアンビエント・トランザクションの存在を検出し、自動的にエンリストできます。クライアント・アプリケーションでは、CommittableTransaction を作成し、EnlistTransaction メソッドを呼び出してエンリストすることもできます。この機能は SQL Anywhere .NET 2.0 データ・プロバイダでサポートされています。分散トランザクションには、大きなパフォーマンスのオーバヘッドがあります。非分散トランザクションにデータベース・トランザクションを使用することをおすすめします。