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

SQL Anywhere 12.0.1 » SQL Anywhere サーバー SQL の使用法 » トランザクションと独立性レベル » 独立性レベルのチュートリアル » チュートリアル:繰り返し不可能読み出しの知識

 

レッスン 2:繰り返し不可能読み出しの回避

 ♦ スナップショットアイソレーションを使用した繰り返し不可能読み出しの回避

スナップショットアイソレーションを使用してブロックを回避することもできます。スナップショットアイソレーションを使用するトランザクションはコミットされたデータだけを認識するため、Accountant のトランザクションは、Sales Manager のトランザクションをブロックしません。

  1. Interactive SQL を起動します。

  2. [接続] ウィンドウで、Sales Manager として SQL Anywhere サンプルデータベースに接続します。

    1. [アクション] ドロップダウンリストから、[ODBC データソースを使用した接続] をクリックします。

    2. [ODBC データソース名] をクリックし、その下のフィールドに SQL Anywhere 12 Demo と入力します。

    3. 必要に応じて、[詳細] をクリックし、[詳細オプション] タブを表示します。

    4. [詳細オプション] タブをクリックし、[ConnectionName] フィールドに Sales Manager と入力します。

    5. [接続] をクリックします。

  3. Interactive SQL をもう 1 つ起動します。

  4. [接続] ウィンドウで、Accountant として SQL Anywhere サンプルデータベースに接続します。

    1. [アクション] ドロップダウンリストで、[ODBC データソースを使用した接続] をクリックします。

    2. [ODBC データソース名] をクリックし、その下のフィールドに SQL Anywhere 12 Demo と入力します。

    3. 必要に応じて、[詳細] ボタンをクリックし、[詳細オプション] タブを表示します。

    4. [詳細オプション] タブをクリックし、[ConnectionName] フィールドに Accountant と入力します。

    5. [接続] をクリックします。

  5. Accountant として次の文を実行して、データベースのスナップショットアイソレーションを有効にし、snapshot 独立性レベルを使用することを指定します。

    SET OPTION PUBLIC.allow_snapshot_isolation = 'On';
    SET TEMPORARY OPTION isolation_level = 'snapshot';
  6. Accountant は、バイザーの価格をリストすることにします。Accountant として、次の文を実行します。

    SELECT ID, Name, UnitPrice
    FROM Products
    ORDER BY ID;
    ID Name UnitPrice
    300 Tee Shirt 9.00
    301 Tee Shirt 14.00
    302 Tee Shirt 14.00
    400 Baseball Cap 9.00
    401 Baseball Cap 10.00
    500 Visor 7.00
    501 Visor 7.00
    ... ... ...
  7. Sales Manager は、プラスチックバイザーに新価格を導入することにします。Sales Manager として、次の文を実行します。

    UPDATE Products
    SET UnitPrice = 5.95 WHERE ID = 501;
    COMMIT;
    SELECT ID, Name, UnitPrice FROM Products
    WHERE Name = 'Visor';
  8. Accountant はクエリをもう一度実行しますが、最初の読み込み時にコミットされたデータがトランザクションで使用されるため、価格の変更を認識しません。

    SELECT ID, Name, UnitPrice
    FROM Products;
  9. Sales Manager として、プラスチックバイザーを元の価格に戻します。

    UPDATE Products
    SET UnitPrice = 7.00
    WHERE ID = 501;
    COMMIT;

    データベースサーバーは、Accountant が読み込み中の Products テーブルのローに読み込みロックをかけません。これは Sales Manager が Products テーブルに変更を加える前に作成された、コミットされたデータのスナップショットを Accountant が閲覧しているためです。

  10. Accountant が価格の閲覧を終了しました。データベースを誤って変更するのを防ぐために、ROLLBACK 文でトランザクションを完了します。

    ROLLBACK;