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 のトランザクションは、Sales Manager のトランザクションをブロックしません。

前提条件

このレッスンは、受講者がこれまでのすべてのレッスンを終了していることを前提としています。レッスン 1:繰り返し不可能読み出しの作成を参照してください。

このレッスンでは、このチュートリアルの開始時に、権限のセクションで一覧されているロールと権限を持っていることを前提としています。 チュートリアル:繰り返し不可能読み出しの知識

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

    SET OPTION PUBLIC.allow_snapshot_isolation = 'On';
    SET TEMPORARY OPTION isolation_level = 'snapshot';
  2. Accountant として、次の文を実行し、サンバイザーの価格のリストを表示します。

    SELECT ID, Name, UnitPrice
    FROM GROUPO.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
    ... ... ...
  3. Sales Manager として、次の文を実行し、プラスチック製サンバイザーの新しい販売価格を導入します。

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

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

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

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

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

    ROLLBACK;

結果

スナップショットアイソレーションを使用して、繰り返し不可能読み出しを防ぐことができました。