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 が価格更新のプロセスを実行しているときに Accountant が計算を行う、ダーティリードを作成します。Accountant は、Sales Manager が入力後に訂正を加えている過程の間違った情報を使用して計算しました。

前提条件

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

 ♦ タスク
  1. Sales Manager として、次の文を実行してすべての T シャツの価格を 0.95 ドル上げます。

    UPDATE GROUPO.Products
       SET UnitPrice = UnitPrice + 95
       WHERE Name = 'Tee Shirt';
    SELECT ID, Name, UnitPrice
       FROM GROUPO.Products;

    次の結果セットが返されます。

    ID Name UnitPrice
    300 Tee Shirt 104.00
    301 Tee Shirt 109.00
    302 Tee Shirt 109.00
    400 Baseball Cap 9.00
    ... ... ...

    ここで、Sales Manager 95 ではなく 0.95 を入力しなくてはならなかったことに気が付きます。しかし、間違いを訂正する前に、Accountant が別のオフィスからそのデータベースにアクセスしてきました。

  2. Accountant は、在庫額が多いことを懸念しています。Accountant として次の文を実行し、全在庫品の小売り価格の合計を計算します。

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

    次の結果が返されます。

    Inventory
    21453.00

    残念ながら、この計算は正確ではありません。Sales Manager が誤って T シャツの価格を 95 ドル上げてしまったため、合計に誤りがあります。このような誤りは、「ダーティリード」と呼ばれる典型的な矛盾の例です。Accountant であるあなたは、Sales Manager が入力したデータにアクセスしますが、このデータはまだコミットされていません。

  3. Sales Manager として、最初の変更をロールバックし、正しい UPDATE 文を入力して間違いを訂正します。新しく入力した値が正しいかをチェックします。

    ROLLBACK;
    UPDATE GROUPO.Products
    SET UnitPrice = UnitPrice + 0.95
    WHERE NAME = 'Tee Shirt';

    次の結果セットが返されます。

    ID Name UnitPrice
    300 Tee Shirt 9.95
    301 Tee Shirt 14.95
    302 Tee Shirt 14.95
    400 Baseball Cap 9.00
    ... ... ...
  4. Accountant は、計算した値に誤りがあったことに気づきません。Accountant のウィンドウでもう一度 SELECT 文を実行すると、正しい値が表示されます。

    SELECT SUM( Quantity * UnitPrice )
     AS Inventory
       FROM GROUPO.Products;
    Inventory
    6687.15
  5. Sales Manager のウィンドウでのトランザクションを終了します。Sales Manager は COMMIT 文を入力して変更を確定できますが、ここでは、ROLLBACK 文を実行して、SQL Anywhere サンプルデータベースのローカルコピーが変更されないようにします。

    ROLLBACK;

結果

Accountant は、データベースサーバが Sales Manager と Accountant の作業を同時に処理しているため、知らない間に間違った情報を受け取っています。