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 の使用法 » トランザクションと独立性レベル » 独立性レベルのチュートリアル » チュートリアル:繰り返し不可能読み出しの知識

 

レッスン 1:繰り返し不可能読み出しの作成

Sales Manager によって変更され、同じトランザクション中に 2 つの異なる結果を取得するローを Accountant が読み出す、繰り返し不可能読み出しを作成します。

前提条件

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

 ♦ タスク
  1. 次の文を実行して、Accountant の接続の独立性レベルを 1 に設定します。

    SET TEMPORARY OPTION isolation_level = 1;
  2. 次の文を実行して、Sales Manager のウィンドウに独立性レベル 1 を設定します。

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

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

    SELECT ID, Name, UnitPrice FROM GROUPO.Products
    WHERE Name = 'Visor';
    UPDATE GROUPO.Products
    SET UnitPrice = 5.95 WHERE ID = 501;
    COMMIT;
    SELECT ID, Name, UnitPrice FROM GROUPO.Products
    WHERE Name = 'Visor';
    ID Name UnitPrice
    500 Visor 7.00
    501 Visor 5.95
  5. Sales Manager ウィンドウでのバイザーの価格と Accountant ウィンドウでの価格を比較してみてください。Accountant として SELECT 文をもう一度実行すると、Sales Manager の新価格が表示されます。

    SELECT ID, Name, UnitPrice
    FROM GROUPO.Products;
    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 5.95
    ... ... ...

    この矛盾を「「繰り返し不可能読み出し」」と呼んでいます。Accountant が 2 回目も同じトランザクションで同じ SELECT 文を実行した後で、同じ結果が得られないためです。

    もちろん、Accountant が SELECT を再度使用する前に、COMMIT や ROLLBACK 文などを発行してトランザクションを終了した場合には、状況は違ってきます。データベースは複数のユーザが同時に使用でき、Accountant のトランザクションの前後に他の人が値を変更できます。他の人が行った変更によって矛盾が生じるのは、Accountant のトランザクションの途中で変更が行われるためです。そうしたイベントにより、スケジュールは直列化不可能となります。

  6. Accountant はこれに気づき、以降は価格参照中にほかからの変更を防ぐことにします。繰り返し不可読み出しは、独立性レベル 2 で削除されます。Accountant として、次の文を実行します。

    SET TEMPORARY OPTION isolation_level = 2;
    SELECT ID, Name, UnitPrice
    FROM GROUPO.Products;
  7. Sales Manager は、明日受注するはずの大口注文に値下げを適用しなくて済むように、プラスチックバイザーの安売りを来週に延期することを決定します。Sales Manager として、次の文を実行します。文の実行が始まりますが、ウィンドウは実行中のまま終了しません。

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

    データベースサーバは独立性レベル 2 では繰り返し可能読み出しを保証する必要があります。Accountant は独立性レベル 2 を使用するため、データベースサーバは Accountant が読み込む Products テーブルの各ローに読み込みロックをかけます。Sales Manager が価格を元に戻そうとすると、そのトランザクションは、Products テーブルのプラスチックバイザーのローに書き込みロックをかける必要があります。書き込みロックは排他ロックであるため、Accountant のトランザクションが読み込みロックを解放するまで待機しなければなりません。

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

    ROLLBACK;

    データベースサーバがこの文を実行すると、Sales Manager のトランザクションが完了します。

    ID Name UnitPrice
    500 Visor 7.00
    501 Visor 7.00
  9. Sales Manager もトランザクションを終了できるようになりました。Sales Manager は、変更をコミットして、元の価格をリストアします。

    COMMIT;

結果

Accountant は、同じトランザクション中に異なる結果を受け取ります。したがって、スナップショット独立性レベル 2 を有効にして、繰り返し不可能読み出しを防ぎます。Accountant がデータベースを変更すると、Sales Manager はデータベースを変更できなくなります。

Accountant の独立性レベルを 1 から 2 に更新したときに、データベースサーバは、前に誰もロックをかけたことのない場所で読み込みロックを使用しました。それ以降、選択内容に適合するローごとに読み込みロックをかけました。

前述のチュートリアルでは、UPDATE 文の実行中に Sales Manager のウィンドウがフリーズしました。データベースサーバは UPDATE 文の実行を開始し、Sales Manager が変更を必要としているローに Accountant のトランザクションが読み込みロックをかけていることを発見しました。この時点で、データベースサーバは UPDATE の実行を一時停止します。Accountant が ROLLBACK でトランザクションを終了すると、データベースサーバは自動的にロックを解放します。妨げがなくなると、データベースサーバが Sales Manager の UPDATE を最後まで処理します。

 参照