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

SAP Sybase SQL Anywhere 16.0 » SQL Anywhere サーバ SQL の使用法 » トランザクションと独立性レベル » 独立性レベルのチュートリアル » チュートリアル:ダーティリードの知識

 

レッスン 2:スナップショットアイソレーションを使用してダーティリードを避ける

スナップショットアイソレーションは、他のデータベースがクエリに対応してコミットされたデータだけに接続できるようにして、ダーティリードの発生を防ぎます。Accountant は、スナップショットアイソレーションを使用して、コミットされたデータがクエリに影響を与えないようにすることができます。

前提条件

このレッスンは、受講者がこれまでのすべてのレッスンを終了していることを前提としています。レッスン 1:ダーティリードの作成を参照してください。

このレッスンでは、このチュートリアルの開始時に、権限のセクションで一覧されているロールと権限を持っていることを前提としています。 チュートリアル:ダーティリードの知識

 ♦ タスク
  1. Sales Manager として次の文を実行し、データベースのスナップショットアイソレーションを有効にします。

    SET OPTION PUBLIC.allow_snapshot_isolation = 'ON';
  2. Sales Manager として、すべての T シャツの価格を 0.95 ドル上げます。

    1. 次の文を実行して価格を更新します。

      UPDATE GROUPO.Products
      SET UnitPrice = UnitPrice + 0.95
      WHERE Name = 'Tee Shirt';
    2. Sales Manager 用の新しい T シャツ価格を使用して、全在庫品の小売り価格の合計を計算します。

      SELECT SUM( Quantity * UnitPrice )
       AS Inventory
         FROM GROUPO.Products;

      次の結果が返されます。

      Inventory
      6687.15
  3. Accountant として次の文を実行し、全在庫品の小売り価格の合計を計算します。このトランザクションは snapshot 独立性レベルを使用するため、データベースにコミットされたデータのみで結果が計算されます。

    SET OPTION isolation_level = 'Snapshot';
    SELECT SUM( Quantity * UnitPrice )
     AS Inventory
       FROM GROUPO.Products;

    次の結果が返されます。

    Inventory
    6538.00
  4. Sales Manager として次の文を実行し、データベースに対する変更をコミットします。

    COMMIT;
  5. Accountant として次の文を実行し、現在の在庫の更新後の小売り価格を表示します。

    COMMIT;
    SELECT SUM( Quantity * UnitPrice )
     AS Inventory
       FROM GROUPO.Products;

    次の結果が返されます。

    Inventory
    6687.15

    Accountant のトランザクションで使用されるスナップショットは最初の読み込み操作で開始するため、COMMIT を実行してトランザクションを終了し、スナップショットトランザクションの開始後に加えられたデータの変更を Accountant が確認できるようにする必要があります。

  6. Sales Manager として次の文を実行し、T シャツの価格の変更を取り消し、SQL Anywhere サンプルデータベースを元の状態に復元します。

    UPDATE GROUPO.Products
    SET UnitPrice = UnitPrice - 0.95
    WHERE Name = 'Tee Shirt';
    COMMIT;

結果

Accountant は、スナップショットアイソレーションを有効にして、ダーティリードを防ぐことができました。

次の手順

(省略可) サンプルデータベース (demo.db) を元の状態にリストアします。サンプルデータベースの再作成 (demo.db)を参照してください。